多对多可通过两个多对一实现(把第三张表抽取出一个实体,然后两个多对应一个新实体)
多对多会建立三张表,第三张表存放两个外键分别指向两个多;然后两个外键作为第三张表的联合主键
一、单向关联映射
Many(维护端:User)
<?xml version="1.0"encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.app.model"> <class name="User"table="t_user"> <id name="id"> <generator class="increment"/> </id> <property name="name"/> <!-- 维护关系 --> <!-- table:指定第三张表的表名 --> <set name="roles"table="t_user_role"> <!—在‘多’的一端(第三张表)添加外键(user_id)指本端 --> <key column="user_id"></key> <!—- 在多的一端(第三张表)添加外键(role_id)指向关系端 --> <many-to-many class="org.app.model.Role" column="role_id" /> </set> </class> </hibernate-mapping>
To
Many(非维护端:User)
<?xml version="1.0"encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.app.model"> <class name="Role" table="t_role"> <id name="id"> <generator class="increment"/> </id> <property name="name"/> </class> </hibernate-mapping>
public void testManyToMany() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); // 先保存非维护端 Role role1 = new Role(); role1.setName("role1"); session.save(role1); Role role2 = new Role(); role2.setName("role2"); session.save(role2); Role role3 = new Role(); role3.setName("role3"); session.save(role3); Role role4 = new Role(); role4.setName("role4"); session.save(role4); // 再保存维护端 User u1 = new User(); u1.setName("name1"); Set<Role> u1Roles = new HashSet<Role>(); u1Roles.add(role1); u1Roles.add(role2); u1.setRoles(u1Roles); session.save(u1); User u2 = new User(); u2.setName("name2"); Set<Role> u2Roles = new HashSet<Role>(); u2Roles.add(role1); u2Roles.add(role2); u2Roles.add(role3); u2.setRoles(u2Roles); session.save(u2); User u3 = new User(); u3.setName("u3"); Set<Role> u3Roles = new HashSet<Role>(); u3Roles.add(role3); u3Roles.add(role4); u3.setRoles(u3Roles); session.save(u3); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtils.closeSession(session); } }
二、双向关联映射
可在任意一端使用reverse属性反转让只让另一端作为维护端
Many(维护端:User)
<?xml version="1.0"encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.app.model"> <class name="User" table="t_user"> <id name="id"> <generator class="increment"/> </id> <property name="name"/> <set name="roles"table="t_user_role"> <key column="user_id"></key> <many-to-many class="org.app.model.Role" column="role_id" /> </set> </class> </hibernate-mapping>
To
Many(维护端:User)
<?xml version="1.0"encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.app.model"> <class name="Role" table="t_role"> <id name="id"> <generator class="increment"/> </id> <property name="name"/> <set name="users"table="t_user_role"> <!—在‘多’的一端(第三张表)添加外键(role_id)指向本端--> <key column="role_id"/> <!—维护关系:在‘多’的一端(第三张表)添加外键(user_id)指向关系端--> <many-to-many class="org.app.model.User" column="user_id" /> </set> </class> </hibernate-mapping>
时间: 2024-10-10 06:09:28