Hibernate双向的一对多关系映射

xiaoxiao2021-02-28  106

单向一对多就是我们想通过一的一端获取多的一端的数据 单向多对一就是我们想通过多的一端获取一的一端的数据 但是有些应用我们既想通过一的一端获取多的一端的数据,又想通过多的一端获取一的一端的数据,那么这时候我们就需要配置双向的一对多的关系映射


表结构如下: student和grade类

public class Student { private int id; private String name; private int age; private Grade grade; //get…set } public class Grade { private int id; private String name; private Set<Student> students = new HashSet<Student>(0); //get…set }

student.hbm.xml

<hibernate-mapping package="cn.siggy.pojo"> <class name="Student"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <property name="age"/> <many-to-one name="grade" class="Grade" column="grade_id" not-null="true"></many-to-one> </class> </hibernate-mapping>

Grade.hbm.xml

<hibernate-mapping package="cn.siggy.pojo"> <class name="Grade"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <!-- set是 Grade中的集合属性 name属性名称 --> <set name="students"> <!-- key表示外键 column外键列名--> <key column="grade_id"></key> <!-- one-to-many 一对多 类Grade 中 students 所表示类型 --> <one-to-many class="Student"/> </set> </class> </hibernate-mapping>

如果你是用List或者其他有序集合,那么需要设置外键对应的key列为not null,让hibernate来从集合端管理关联,维护每个元素的索引

测试

session = HibernateUtil.getSession(); tx = session.beginTransaction(); Grade grade = new Grade(); grade.setName("基础"); Student stu = new Student(); stu.setName("张三疯"); stu.setAge(22); stu.setGrade(grade); Student stu1 = new Student(); stu1.setName("老王"); stu1.setAge(23); stu1.setGrade(grade); //关联 //保存数据的顺序 是根据外键的配置来决定的 //如果外键不能为null,那么先保存一的一端 //如果外键可以为null,则可以随意保存 session.save(grade); session.save(stu); session.save(stu1); tx.commit();

其实综上,双向就是单向一对多和单向多对一都配置

转载请注明原文地址: https://www.6miu.com/read-33809.html

最新回复(0)