1.
拿Classes和Student为例。
package com.test;
import java.util.Set;
public class Classes {
private Integer classesId;
private String classesName;
private Set students;
public Set getStudents() {
return students;
}
public void setStudents(Set students) {
this.students = students;
}
public Integer getClassesId() {
return classesId;
}
public void setClassesId(Integer classesId) {
this.classesId = classesId;
}
public String getClassesName() {
return classesName;
}
public void setClassesName(String classesName) {
this.classesName = classesName;
}
}
<?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>
<class name="com.test.Classes" table="classes">
<id name="classesId" column="classes_id">
<generator class="native"/>
</id>
<property name="classesName" column="classes_name"/>
<set name="students">
<!-- key是外键 -->
<key column="cls_id"/>
<one-to-many class="com.test.Student"/>
</set>
</class>
</hibernate-mapping>
package com.test;
public class Student {
private Integer studentId;
private String studentName;
public Integer getStudentId() {
return studentId;
}
public void setStudentId(Integer studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
}
<?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>
<class name="com.test.Student" table="student">
<id name="studentId" column="student_id">
<generator class="native"/>
</id>
<property name="studentName" column="student_name"/>
</class>
</hibernate-mapping>
测试类:
public void testAdd(){
Session session = HibernateUtils.getSession();
session.beginTransaction();
Student student1 = new Student();
student1.setStudentName("zhangsan");
Student student2 = new Student();
student2.setStudentName("lisi");
Classes classes = new Classes();
classes.setClassesName("02-1");
Set students = new HashSet();
students.add(student1);
students.add(student2);
classes.setStudents(students);
session.save(classes);
session.getTransaction().commit();
HibernateUtils.closeSession(session);
}
这时会报org.hibernate.TransientObjectException异常,说明save classes对象时,student1和student2还是游离态对象,但是因为是一对多关系,所以一方Classes要知道多方的信息,这时多方还是游离态,所以就报错了。
可以设置让 Student对象级联更新。如下:
<set name="students" cascade="all">
<!-- key是外键 -->
<key column="cls_id"/>
<one-to-many class="com.test.Student"/>
</set>
执行的sql代码如下:
Hibernate: insert into classes (classes_name) values (?)
Hibernate: insert into student (student_name) values (?)
Hibernate: insert into student (student_name) values (?)
Hibernate: update student set cls_id=? where student_id=?
Hibernate: update student set cls_id=? where student_id=?
可以看出是先insert,再update.这样有个缺点:如果数据量很大时会严重影响效率。可以通过inverse标签反转下。
<set name="students" cascade="all" inverse="true">
<!-- key是外键 -->
<key column="cls_id"/>
<one-to-many class="com.test.Student"/>
</set>
执行的sql如下:
Hibernate: insert into classes (classes_name) values (?)
Hibernate: insert into student (student_name) values (?)
Hibernate: insert into student (student_name) values (?)
但是这时数据库记录里外键的值是null.
所以还需要配置双向关联。
Studnet.hbm.xml里添加:
<many-to-one name="classes" column="cls_id"></many-to-one>
Student.java里添加:
private Classes classes;
public Classes getClasses() {
return classes;
}
public void setClasses(Classes classes) {
this.classes = classes;
}
测试类里添加:
classes.setStudents(students);
student1.setClasses(classes);
student2.setClasses(classes);
如果不设置级联更新,也可以这样:
Classes.hbm.xml
<set name="students" inverse="true" >
<!-- key是外键 -->
<key column="cls_id"/>
<one-to-many class="com.test.Student"/>
</set>
Student.hbm.xml不变:
<many-to-one name="classes" column="cls_id"></many-to-one>
测试类:
public void testAdd1(){
Session session = HibernateUtils.getSession();
session.beginTransaction();
Student student1 = new Student();
student1.setStudentName("zhangsan");
Student student2 = new Student();
student2.setStudentName("lisi");
Classes classes = new Classes();
classes.setClassesName("02-1");
student1.setClasses(classes);
student2.setClasses(classes);
session.save(classes);
session.save(student1);
session.save(student2);
session.getTransaction().commit();
HibernateUtils.closeSession(session);
}
执行sql:
Hibernate: insert into classes (classes_name) values (?)
Hibernate: insert into student (student_name, cls_id) values (?, ?)
Hibernate: insert into student (student_name, cls_id) values (?, ?)
总结:
1.都需要设置双向关联(指的是配置文件)
2.都需要设置inverse=true。(对级联来说,不用先insert,再update了)
3.设置了 cascade以后,save的是Classes对象,Student会级联保存。前提是双方关联:
classes.setStudents(students);
student1.setClasses(classes);
student2.setClasses(classes);
4.没有设置cascade的话,save的是Student对象。不过save Student对象以前,要先save Classes对象。
分享到:
相关推荐
"Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联。在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-...
本话题主要探讨两种基本的关系映射类型:many-to-one(多对一)和one-to-many(一对多)。这两种关系映射是数据库中常见的关联类型,理解和掌握它们对于开发高质量的Java应用至关重要。 1. many-to-one关系 many-to...
在配置双向一对多关联时,我们通常在"多"一端(这里是`Student`)的集合属性上使用`<many-to-one>`标签,将`Classes`对象映射到数据库中的外键。同时,在"一"端(`Classes`)使用`<set>`标签,表示班级可以包含多个...
同时,`Account.hbm.xml`中的`many-to-one`元素将`column`属性设置为`FID`,表示通过`FID`字段关联到`User`实体。 #### 测试场景解释 在测试场景中,我们创建了一个`User`对象和一个`Account`对象,并在`User`对象...
在Hibernate中,`one-to-many`关系是常见的实体间关系之一,表示一个实体可以与多个其他实体相关联。本文将深入探讨`Hibernate one-to-many`注解的使用和实现细节。 ### 一、`@OneToMany`注解概述 `@OneToMany`...
在Hibernate中,一对一唯一外键关联映射可以通过 `<many-to-one>` 标签来配置。例如,以下是Person实体与IdCard实体的一对一唯一外键关联映射配置: ```xml <many-to-one name="idCard" column="card_id...
### Hibernate Many-to-One (多对一) 及 Cascade (级联) #### 一、Many-to-One(多对一) 在数据库设计中,实体之间的关系主要包括一对一、一对多、多对多等几种类型。而在ORM(对象关系映射)框架Hibernate中,...
本实例将详细讲解如何在Hibernate中实现Many-to-One关系映射,这是一种常见的数据库关联,表示一个实体可以与多个其他实体相关联。 在Many-to-One关系中,通常一个实体(如部门)可以有多个相关实体(如员工),而...
Hibernate中many-to-one关系的编写_远航的水手
本示例将详细讲解如何在Hibernate中实现多对多(many-to-many)的关系映射。 在数据库设计中,多对多关系是指两个实体之间存在多个关联,比如学生和课程的关系,一个学生可以选修多门课程,一门课程也可以被多个...
Hibernate中many-to-one关系的编写_远航的水手.htm
本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...
为了使用 `publisher` 属性,我们需要在 `Book` 类的 Hibernate 映射文件中添加 `<many-to-one>` 映射。这将在 `BOOK` 表中添加一个名为 `PUBLISHER_ID` 的列,并存储关联出版商的 ID。 ```xml <!-- 其他属性的...
标题"Hibernate one to many(many to one) 配置"涉及到的是关系型数据库在Java中的持久化框架Hibernate中的两种关联映射关系:一对一(One-to-One)和多对一(Many-to-One)。在数据库设计中,这种关系很常见,例如...
在本文中,我们将深入探讨如何使用Hibernate来实现多对多(many-to-many)的映射关系。 首先,多对多映射关系通常涉及到两个实体类之间的关联,例如在学生选课的例子中,学生(Student)和课程(Course)之间存在多...
【标题】"hibernate-one-to-many-uni" 指的是在Hibernate框架下实现的一对多单向关联关系。Hibernate是Java开发中常用的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是数据库交互。在这个...
在数据库世界中,一对多(One-to-Many)关系是一种常见的关联类型,其中一个表(父表)可以与多个其他表(子表)相关联。在NHibernate中,配置这种映射关系对于理解和使用ORM至关重要。 一对多关系意味着一个实体...
<many-to-one name="department" class="com.example.Department" column="DEPARTMENT_ID" /> ``` 如果使用注解,上述关系已经在实体类中定义。 ### 3. 操作一对多关系 在实际应用中,我们可以通过Hibernate提供...
本篇文章将全面探讨Hibernate的关联映射学习,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)以及多对多(Many-to-Many)四种关系映射。 首先,一对一关联映射(One-to-One)是两个实体...
本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 一、Hibernate对象三状态 1. 游离态(Detached):对象在应用程序中创建,但尚未与Session...