hibernate 多对多代码

来源:互联网 发布:开淘宝要注意什么问题 编辑:程序博客网 时间:2024/05/01 23:39

没事干,决定学习一下hibernate,测试了一下多对多单向关联,把代码贴出来,以备以后用。

使用的maven创建项目,pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.mxy</groupId>  <artifactId>hibernatetest</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>  <name>hibernatetest</name>  <url>http://maven.apache.org</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties>  <dependencies>    <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>4.2.4.Final</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.26</version></dependency>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.10</version>      <scope>test</scope>    </dependency>  </dependencies></project>

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>        <!-- Database connection settings -->        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="connection.url">jdbc:mysql://localhost/hibernate</property>        <property name="connection.username">root</property>        <property name="connection.password">password</property>        <!-- JDBC connection pool (use the built-in) -->        <property name="connection.pool_size">1</property>        <!-- SQL dialect -->        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>        <!-- Enable Hibernate's automatic session context management -->        <property name="current_session_context_class">thread</property>        <!-- Disable the second-level cache  -->        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>        <!-- Echo all executed SQL to stdout -->        <property name="show_sql">true</property>        <property name="hibernate.format_sql">true</property>        <!-- Drop and re-create the database schema on startup -->        <property name="hbm2ddl.auto">update</property>        <!-- <mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/> -->                <mapping class="com.mxy.entity.User"/>        <mapping class="com.mxy.entity.Role"/>        <mapping class="com.mxy.entity.Permission"/>    </session-factory></hibernate-configuration>

java类,User

package com.mxy.entity;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;@Entitypublic class User {@Id@GeneratedValueprivate int id;private String username;private String password;@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE},targetEntity=Role.class)@JoinColumn(name="roleid")private Role role;public Role getRole() {return role;}public void setRole(Role role) {this.role = role;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

Role

package com.mxy.entity;import java.util.Set;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToMany;@Entitypublic class Role {@Id@GeneratedValueprivate int id;private String rolename;@ManyToManyprivate Set<Permission> permissions;public Set<Permission> getPermissions() {return permissions;}public void setPermissions(Set<Permission> permissions) {this.permissions = permissions;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getRolename() {return rolename;}public void setRolename(String rolename) {this.rolename = rolename;}}

Permission

package com.mxy.entity;import java.util.Set;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToMany;@Entitypublic class Permission {@Id@GeneratedValueprivate int id;private String permission;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getPermission() {return permission;}public void setPermission(String permission) {this.permission = permission;}}


测试类:

package com.mxy.hibernatetest;import java.util.HashSet;import java.util.Set;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.AnnotationConfiguration;import org.junit.AfterClass;import org.junit.BeforeClass;import com.mxy.entity.Permission;import com.mxy.entity.Role;import com.mxy.entity.User;public class Test {private static SessionFactory sessionFactory;private static Session session;@BeforeClasspublic static void beforeClass() {sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();session = sessionFactory.getCurrentSession();session.beginTransaction();}@AfterClasspublic static void afterClass() {session.getTransaction().commit();sessionFactory.close();}@org.junit.Testpublic void TestM2M(){Role role = new Role();role.setRolename("userq");Permission per = new Permission();per.setPermission("lookq");Set<Permission> pers = new HashSet<Permission>();pers.add(per);role.setPermissions(pers);session.save(per);session.save(role);}@org.junit.Testpublic void TestM2M_DELETE(){Role role = (Role)session.createQuery("from Role role where role.id = '2'").list().get(0);session.delete(role);}@org.junit.Testpublic void TestUserSave(){User u = new User();u.setUsername("xxx");session.save(u);}@org.junit.Testpublic void TestUpdateUser(){Role role = new Role();role.setRolename("test");User u = (User)session.createQuery("from User user where user.id = '1'").list().get(0);u.setRole(role);session.save(role);session.update(u);}@org.junit.Testpublic void TestInsertPermissionsToRole(){Role role = (Role)session.createQuery("from Role role where role.id = '1'").list().get(0);Set<Permission> pers = new HashSet<Permission>();for(int i = 0;i < 9;i++){Permission per = new Permission();per.setPermission("permission" + i);pers.add(per);session.save(per);}role.setPermissions(pers);session.update(role);}@org.junit.Testpublic void TestDeletePermission(){Permission per = (Permission)session.createQuery("from Permission per where per.id = '4'").list().get(0);session.delete(per);}}

遇到的问题:

1 在使用注解的时候,不能部分加到字段上,部分加到getXXX方法上,需要统一,要不会报错。

2 Role与Permission是多对多的关系,Role是主控方,当想在Permission删除的时候,会报错,显示外键约束,这是我们可以将数据库中role_permission中的对于permission表外键id引用的删除时候的约束改为cacade。我使用的是navicat for mysql,右击role_permission--》设计表--》外键--》删除时,改为cascade。

3 mappedBy配置的是被控方,值为主控方中对应的字段的名字。

原创粉丝点击