知识点
相关文章
更多最近更新
更多hibernate中多对多映射关系
2019-03-28 22:32|来源: 领悟书生
一个用户可以授予多种角色,一种角色可以分配给多个用户。这就是一种多对多的关系。先来看看hibernate中简单的多对多映射关系
管理员的实体类和映射关系
Admin.java
package org.zttc.itat.model; import java.util.Set; public class Admin { private int id; private String name; private Set<Role> roles; // set get 方法省略 }
Admin.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.zttc.itat.model"> <class name="Admin" table="t_admin"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_admin_role" lazy="extra"> <key column="aid"/> <many-to-many class="Role" column="rid"/> </set> </class> </hibernate-mapping>
角色的实体类和映射关系
Role.java
package org.zttc.itat.model; import java.util.HashSet; import java.util.Set; public class Role { private int id; private String name; private Set<Admin> admins; public Role() { admins = new HashSet<Admin>(); } public void add(Admin admin) { admins.add(admin); } //set get 方法省略 }
Role.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.zttc.itat.model"> <class name="Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="admins" table="t_admin_role" lazy="extra"> <key column="rid"/> <many-to-many class="Admin" column="aid"/> </set> </class> </hibernate-mapping>
看看测试类:
package org.zttc.itat.test; import org.hibernate.Session; import org.junit.Test; import org.zttc.itat.model.Admin; import org.zttc.itat.model.Classroom; import org.zttc.itat.model.Role; import org.zttc.itat.model.Student; import org.zttc.itat.util.HibernateUtil; public class TestManyToMany { @Test public void testAdd01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Admin a1 = new Admin(); a1.setName("张三"); session.save(a1); Admin a2 = new Admin(); a2.setName("李四"); session.save(a2); Role r1= new Role(); r1.setName("超级管理员"); r1.add(a1); session.save(r1); Role r2 = new Role(); r2.setName("财务管理人员"); r2.add(a1); r2.add(a2); session.save(r2); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testLoad01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Admin a = (Admin)session.load(Admin.class, 1); System.out.println(a.getName()); for(Role r:a.getRoles()) { System.out.println(r.getName()); } session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } }
使用Many2Many不论在哪一方来维护关系都比较的麻烦,而且很多时候关联表中需要加入其他的属性所以在开发中,经常使用两个一对多来替代多对多
下面的例子是老师与课程之间的多对多关系。
老师的实体及映射
Teacher.java
package org.zttc.itat.model; import java.util.Set; public class Teacher { private int id; private String name; private Set<TeacherCourse> tcs; //set get 方法省略 }
Teacher.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.zttc.itat.model"> <class name="Teacher" table="t_teacher"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="tcs" lazy="extra" inverse="true"> <key column="tid"/> <one-to-many class="TeacherCourse"/> </set> </class> </hibernate-mapping>
课程的实体及映射
Course.java
package org.zttc.itat.model; import java.util.Set; public class Course { private int id; private String name; private Set<TeacherCourse> tcs; //set get 方法省略 }
Course.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.zttc.itat.model"> <class name="Course" table="t_course"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="tcs" lazy="extra" inverse="true"> <key column="cid"/> <one-to-many class="TeacherCourse"/> </set> </class> </hibernate-mapping>
老师课程实体及映射
TeacherCourse.java
package org.zttc.itat.model; public class TeacherCourse { private int id; private double ach; private Teacher teacher; private Course course; //set get 方法省略 }
TeacherCourse.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.zttc.itat.model"> <class name="TeacherCourse" table="t_teacher_course"> <id name="id"> <generator class="native"/> </id> <property name="ach"/> <many-to-one name="teacher" column="tid"/> <many-to-one name="course" column="cid"/> </class> </hibernate-mapping>
测试类:
public class TestManyToMany2 { @Test public void testAdd01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Teacher t1 = new Teacher(); t1.setName("老张"); session.save(t1); Teacher t2 = new Teacher(); t2.setName("老刘"); session.save(t2); Course c1 = new Course(); c1.setName("数据结构"); session.save(c1); Course c2 = new Course(); c2.setName("计算机组成原理"); session.save(c2); TeacherCourse tc1 = new TeacherCourse(); tc1.setAch(87); tc1.setTeacher(t1); tc1.setCourse(c1); session.save(tc1); tc1 = new TeacherCourse(); tc1.setAch(66); tc1.setTeacher(t1); tc1.setCourse(c2); session.save(tc1); tc1 = new TeacherCourse(); tc1.setAch(190); tc1.setTeacher(t2); tc1.setCourse(c1); session.save(tc1); tc1 = new TeacherCourse(); tc1.setAch(20); tc1.setTeacher(t2); tc1.setCourse(c2); session.save(tc1); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } @Test public void testLoad01() { Session session = null; try { session = HibernateUtil.openSession(); session.beginTransaction(); Teacher t = (Teacher)session.load(Teacher.class, 1); //load的时候由于延迟加载,会根据不同的情况取相应的关联对象,所以会发出大量的sql /** * 总体来说:最佳实践就是,一般不使用双向关联,特别不建议使用一的这一方的关联 * 因为从一的这一端取关联对象很有可能会涉及到分页操作,所以基本不会使用 * 在设计的时候不是特殊情况不要使用双向关联。 */ System.out.println(t.getName()); for(TeacherCourse tc:t.getTcs()) { System.out.println(tc.getCourse().getName()+":"+tc.getAch()); } session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); if(session!=null) session.getTransaction().rollback(); } finally { HibernateUtil.close(session); } } }
本文链接:hibernate中多对多映射关系,由领悟书生原创(笔记),转载请注明出处http://www.656463.com/article/402
相关问答
更多-
property-ref是为了解决遗留系统中实体之间的关联。 默认情况下,把被关联实体主键字段作为关联字段。有了property-ref,就可以 通过它指定被关联实体主键以外的字段作为关联字段。 在Class Person的配置中,若 外键未设置property-ref="userId" 的话,表之间的关联语句将如下: Person left outer join Account on Person.id=Account.userId (被关联实体主键字段作为关联字段) 设置,则如下: Person lef ...
-
Hibernate:在社交网络中映射用户 - 朋友关系(Hibernate: Mapping User-Friends relation in Social Networks)[2022-05-23]
关于多对多的事实是它需要更多的配置,因为Hibernate必须生成关系表。 尝试这个: @Entity @Table(name="users") public class User { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="userid") protected Long id = null; @ManyToMany @JoinTable(name = "user_friends", ... -
休眠时可以加入三张表。 我有类似的问题(在你的例子中)ShippingOption与分销商和ShippingMethod有ManyToOne关系。 Distributor (d_id, name) ShippingMethod (sm_id, name, description) ShippingOption (sp_id, d_id, sm_id, name, default, active, cost, availability, foreign key(d_id), foreign key(sm_id ...
-
我猜这种关系如下: 一个ApplicationField有许多设备。 一个设备可以引用多个ApplicationField。 如果这是真的,那么在你的映射中有一些错误。 更换设置为下列设备的设备(更改Id列):
-
尝试修改集而不是替换它。 即: quotation.getQuotationItem().clear(); quotation.getQuotationItem().addAll(newSet); 这是由于一些冬眠的怪异。 除此之外,还有一点关于命名。 您的Quotation.quotationItem应该命名为quotationItems因为它包含多个QuotationItem 。 Try to modify the set rather than replace it. i.e.: ...
-
看看这个答案 ,它解释了如何在多对多关系中拥有属性,这基本上就是你所需要的。 Check out this - answer which explains how to have attributes on a many-to-many relationship,which is what you need basically.
-
我假设您使用联结表,所以我会这样做: Company.class @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinTable(name = "nameOfJunctionTable", catalog = "yourDatabaseName", joinColumns = { @JoinColumn(name = "companyId", nullable = false, updatable = fa ...
-
如何在Hibernate中使用额外的列映射多对多关系(How to map many-to-many relation in Hibernate with a extra columns)[2022-09-06]
将其映射为具有多对一的复合元素:-
...
你在这里做的是bidrectional many-to-one的bidrectional many-to-one ,你想要在关系的两边填充对象。 如果双方都有JoinColumn ,Hibernate会抱怨,所以只需将它放在“拥有”端并将mappedBy添加到另一侧。 看这个例子: public class UserAvatar { ... @ManyToOne @JoinColumn(name="userId") // userId is the name of your dat ...忘记id的引用。 在Hibernate中,您使用对象而不是表。 我想你的代码可以写成这样: @Entity @Table(name="your_table") public class Item{ private Long id; private Item parentItem; private List- children; @Id @GeneratedValue(strategy=GenerationType.AUTO) ...