今天讲的是其实是一个老生常谈的问题,但这前一直没有完全搞清楚,今天正好项目里遇到相关问题,仔细弄了一会儿,终于算是搞明白了。
不知道大家有没有遇到过这个问题,举例先:
@Entity public class Teacher { private String name; private Set<Student> students; @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name = "teacher_oid") public Set<Student> getStudents() { return students; } //其他代码省略....... } @Entity public class Student { private String name; }
在以上的例子里, 如果保存teacher时,students里有记录,那么Hibernate会自动保存Teacher和Student的记录,但问题在于,控制台可能会生成以下几句SQL:
insert into teacher(name, id) values ("T1", 1);
insert into student(name, id) values("S1", 1);
update student set teacher_oid = 1 where id = 1;
请留意以上第3句SQL,是不是觉得很多余,为什么第二句SQL里不能带着teacher_oid一起呢?
这里回到主题,今天要讲的就是Hibernate的inverse的事,通过对inverse的配置,就可以去掉第3句SQL,用2句SQL完成操作。
题外话:在Hibernate4里面,我们主要都是在annotation去实现,很少使用hbm.xml配置文件,那么之前很多文档里提到的那个inverse在注解方式该如何使用呢。其实就是使用mappedBy来完成的。
将之前的代码改成:
@Entity public class Teacher { private String name; private Set<Student> students; @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "teacher") //不需要这行了 @JoinColumn(name = "teacher_oid") public Set<Student> getStudents() { return students; } //其他代码省略....... } @Entity public class Student { private String name; //需要定义Teacher的引用 private Teacher teacher; @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "teacher_oid") public Teacher getTeacher() { } }
也就是OneToMany端配置mappedBy,然后ManyToOne端必须配置One那端的对象,这么改动之后,优点是Hibernate生成的SQL更简洁了,但缺点也很明显,之前子类不需要关注父类,但现在这样,子类必须拥有父类的引用。
生成的SQL如下:
insert into teacher(name, id) values ("T1", 1);
insert into student(name, id, teacher_oid) values("S1", 1, 1);
至于项目中如何选择,就看各位的想法了。
另外,在OneToMany里有一个orphanRemoval的配置,默认为false,也就是在级联操作的情况,如果子类的记录发生删除操作,Hibernate只会将那些被删除的子类记录的外键ID设为Null,但不会删除记录。
如果设为true,则Hibernate会将那些子记录一并删除。
但在操作上需要注意,要按照以下方式:
Teacher teacher = service.findById(1);
//不要直接调用teacher.setStudnets,而是需要先clear,再addAll
teacher.getStudents().clear();
teacher.getStudents().addAll(newStudentsList);
相关推荐
级联操作虽然方便,但也可能带来性能问题,因为它们可能会触发额外的数据库查询或更新。因此,应根据实际需求谨慎选择级联类型,避免不必要的数据库操作。另外,对于那些不需要立即更新数据库的场景,可以考虑使用...
通过这个" Hibernate级联操作一对多demo ",开发者可以深入理解如何在实际项目中利用Hibernate的级联功能来简化代码,提高开发效率,同时也要注意潜在的风险和性能问题。在实践中不断优化,才能更好地掌握这一强大的...
缺点是如果不合理使用,可能导致数据安全问题,比如误删除大量数据,或者性能下降,因为级联操作可能导致过多的数据库交互。 6. **最佳实践**:在实际开发中,应根据业务需求谨慎选择级联类型,避免过度使用,同时...
在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...
总的来说,理解并熟练运用Hibernate的级联操作可以极大地提升开发效率,但也需要注意性能和数据安全问题。通过适当配置和使用Session、Transaction以及HQL,我们可以有效地管理和维护一对多、多对一等关联关系中的...
一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体...
在Java的持久化框架Hibernate中,Many-to-Many关系是一种常见的数据库表之间的关联方式,它表示一个实体可以与多个其他实体进行...但同时要注意,不当的级联操作可能导致数据安全问题,所以需要根据实际情况谨慎选择。
在文档中提到的场景下,我们来详细探讨Hibernate级联删除的原理和配置方法。 首先,我们要理解关系映射中的几个关键概念。在给出的例子中,有四个表:A、AA、B和BB,它们之间存在一对多(one-to-many)和一对一...
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
5. **反转关系**:反转关系涉及到主从关系的反转,通常用于解决级联操作带来的问题。例如,如果在`User`和`Order`的关系中,我们希望由`User`来控制级联操作,可以将`@OneToMany`的`mappedBy`属性设在`User`上,然后...
在IT领域,尤其是在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者用面向对象的方式操作数据库。尽管随着Spring Data JPA等现代技术的崛起,Hibernate的使用频率有所下降,但其核心...
### Hibernate基础之关联映射与级联操作 #### 第一部分:主键生成策略与对象状态管理 ##### 主键生成策略 在使用Hibernate框架时,合理的主键生成策略能够极大地简化开发工作并提升应用性能。Hibernate提供了多种...
总的来说,这个项目展示了如何使用Hibernate、Ajax和DWR来实现一个高效、用户友好的省市县三级级联选择功能。开发过程中涉及了ORM、MVC架构、数据库操作以及前端交互等多个方面,是学习和实践Web开发技能的好实例。
3. 处理Hibernate级联操作问题: 当涉及到使用Hibernate框架进行数据持久化时,可能会遇到级联操作带来的问题。文中提到,直接使用fromObject(list)方法在Hibernate级联操作关联的对象上会报错,如果需要保留级联...
在级联操作中,Hibernate可能被用来处理省市县和年月日的数据存取,通过HQL(Hibernate Query Language)或者Criteria API来执行SQL查询,获取级联选择的数据。 级联操作的核心在于数据间的关联,例如选择一个省后...
### Hibernate级联(Cascade)详解 #### 一、概述 Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...
通过单元测试,我们可以确保关联管理和级联操作符合预期,防止可能出现的数据不一致问题。 4. **one-to-many(5.5)**:这个文件可能包含关于Hibernate 5.5版本的一对多关联的教程或示例。在Hibernate中,`@OneToMany...
【框架】[Hibernate]利用Hibernate进行一对多的级联操作-Web实例 java
在Hibernate中,可以通过`@OneToMany`注解来定义这种关系,并通过`cascade`属性设置级联操作,例如`CascadeType.ALL`表示所有操作都将级联。 2. **一对一(OneToOne)**:这种关系意味着两个实体之间存在一对一的...