* fetch={select/join},默认为select。
* fetch="select" 表示另外发送一条sql语句进行关联查询。
* fetch="join" 表示进行表连接查询。设置为join时,lazy=true失去作用。
* inverse控制的关联关系更新在session.flush时执行,所以在save/update时引发更新关联关系的
insert/update/delete sql总是在最后执行。delete时引发的更新关联关系的update/delete sql总是在
最前面执行。
* inverse 只对one2many many2many有效,对many2one one2one 无效。
由于one方维护关联关系时会发出update更新sql,所以通常在many方维护关联关系。
* cascade 一般不对many2one,many2many,constrained=true的one2one 设置级联删除。
* cascade几种取值:
save-update: 级联保存(load以后如果子对象发生了更新,也会级联更新). 但它不会级联删除
delete: 级联删除, 但不具备级联保存和更新
all-delete-orphan: 在解除父子关系时,自动删除不属于父对象的子对象, 也支持级联删除和级联保存更新.
all: 级联删除, 级联更新,但解除父子关系时不会自动删除子对象.
delete-orphan: 删除所有和当前对象解除关联关系的对象
* 在one2many和many2many的set中设置cascade="all-delete-orphan" 时,在update/flush/commit的
时候不能直接设置clazz.setStudents(null);
会引发异常:A collection with cascade="all-delete-orphan" was no longer referenced by the owning
entity instance。delete操作时,可以直接设置null,这样只会删除clazz表和更新Student表记录。
新建one时,可以设置clazz.setStudents(null);这样只会保存clazz表记录。
* one2many 单向关联:
<set name="students" cascade="save-update">
<key>
<column name="clazz_id" length="32" />
</key>
<one-to-many class="com.jaeson.hibernatestudy.bean.Student" />
</set>
若set设置inverse="true"时,将由多方Student维护关联关系,由于是单向关联,所以多方Student将无法
维护外键,即clazz_id将为null。
缺省inverse="false" 表示由一方Clazz维护外键关联关系,所以在保存时会发出update语句用于更新
Student的外键clazz_id。
当执行session.save(student)时,若clazz_id为not-null,此时将会出项插入异常,所以在one2many单向
关联时需要设置外键clazz_id的属性为not-null="false"。
cascade="save-update" 表示保存Clazz时级联保存Set里关联的Student对象,通常用于<Set>等集合
关联。若没有设置cascade属性,则必须显式保存Student对象session.save(student),否则Clazz在维护
关联关系时会抛出org.hibernate.TransientObjectException异常。
Hibernate: insert into db4myeclipse.clazz (name, id) values (?, ?)
Hibernate: insert into db4myeclipse.student (name, sex, id) values (?, ?, ?)
Hibernate: update db4myeclipse.student set clazz_id=? where id=?
* many2one 单向关联:
需要先保存一方Clazz,再保存多方Student,这样只会有2条insert sql。否则会引发2条insert和一个
update关联关系的sql。
<many-to-one name="clazz" class="com.jaeson.hibernatestudy.bean.Clazz" fetch="join">
<column name="clazz_id" length="32" not-null="true" />
</many-to-one>
fetch="join"时,lazy="true"失去效果,将会和Student一起进行inner join查询。
由于是由多方Student维护外键关联关系,所以外键clazz_id可以设置为not-null="true"。
在保存时需要先保存关联对象Clazz:
session.save(clazz);
session.save(student);
否则Student在维护关联关系时会抛出:
org.hibernate.action.internal.UnresolvedEntityInsertActions异常。
Attempting to save one or more entities that have a non-nullable association with an unsaved
transient entity.
Hibernate: insert into db4myeclipse.clazz (name, id) values (?, ?)
Hibernate: insert into db4myeclipse.student (clazz_id, name, sex, id) values (?, ?, ?, ?)
* many2one 双向关联:
<set name="students" cascade="save-update" inverse="true">
<key>
<column name="clazz_id" length="32" not-null="true" />
</key>
<one-to-many class="com.jaeson.hibernatestudy.bean.Student" />
</set>
<many-to-one name="clazz" class="com.jaeson.hibernatestudy.bean.Clazz" fetch="join">
<column name="clazz_id" length="32" not-null="true" />
</many-to-one>
fetch="join"时,lazy="true"失去效果,将会和Student一起进行inner join查询。
由于设置了inverse="true",所以将由多方Student维持关联关系。
没有设置cascade时必须先保存Clazz对象,再保存Student对象;否则会抛出
org.hibernate.action.internal.UnresolvedEntityInsertActions异常。
Attempting to save one or more entities that have a non-nullable association with an unsaved
transient entity.
若Clazz设置了cascade="save-update"时,可以只执行session.save(clazz)。
Hibernate: insert into db4myeclipse.clazz (name, id) values (?, ?)
Hibernate: insert into db4myeclipse.student (clazz_id, name, sex, id) values (?, ?, ?, ?)
相关推荐
根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...
该资源包括了hibernate开发中的常见关联映射的源代码,其中包括:one2one,one2many,many2many等,还有继承映射,inverse,fetch,cascade关键字的应用等,对初学者来说,是很实用的,难度适中,很好理解
<set name="students" inverse="true" cascade="all" fetch="subselect"> ``` #### 五、批量处理与性能优化 - **Batch Size**: Hibernate支持批量处理,可以通过设置`batch_size`属性来控制批量加载的数量...
4. **inverse属性**:在`@OneToMany`上设置`inverse`为`true`表示被引用的一方负责维护关系,否则由引用的一方维护。 **示例代码** ```java @Entity public class Class { @Id private Long id; @OneToMany...
使用`@ManyToOne`注解,同样可以设置`fetch`和`cascade`属性。例如: ```java @Entity public class Order { @ManyToOne @JoinColumn(name = "user_id") private User user; } @Entity public class User { //...
例如,添加一个新节点到树形结构中,可以先创建父节点和子节点对象,然后设置它们的引用关系,最后将父节点保存到数据库,Hibernate会自动处理关联关系。 ```java ParentEntity parent = new ParentEntity(); List...
`fetch` 属性在 `@ManyToOne` 和 `@OneToMany` 中用来设置加载策略。 8. **反向引用 (Inverse)** 在一对多关系中,可以指定哪一方负责维护关系。通过 `mappedBy` 参数在 `@OneToMany` 或 `@ManyToMany` 注解中,...
如果希望在加载父对象时同时加载子对象,可以设置`fetch`属性为`join`。 6. **性能优化**: 为了提高性能,可以使用`@Cacheable`和`@Cache`注解进行缓存配置,减少数据库查询次数。另外,通过合理设计JOIN和子查询...
6. **级联操作(Cascades)**:通过设置cascade属性,可以控制一个实体的生命周期操作(如保存、更新、删除)是否影响到其关联的实体。谨慎使用,因为不当设置可能会导致数据意外丢失。 7. **反向关联(Inverse)**...
若希望在加载父实体时同时加载所有子实体,可设置`fetch="join"`,实现急加载。 六、性能优化 1. 避免N+1查询问题:在处理一对多关系时,可能会出现多次查询,导致性能下降。使用HQL(Hibernate Query Language)或...
- **一对多**:在映射文件中,通过 `<set>` 标签定义一对多关系,并可通过 `inverse`、`cascade`、`lazy` 和 `fetch` 控制行为。 - **多对一**:通过 `<many-to-one>` 标签定义,可设置 `fetch` 和 `cascade` 属性。...
通过`cascade`属性,可以设置级联操作,比如删除员工时,是否自动删除其所属部门。常见的级联类型包括`CascadeType.ALL`、`CascadeType.PERSIST`等。 3. **外键维护:** 默认情况下,Hibernate会维护从多的一方到...
4. 外键约束:在数据库中,可以设置外键约束以确保数据一致性,但不是必须的,Hibernate可以通过程序逻辑实现数据一致性。 总之,Hibernate的一对多映射配置提供了灵活的方式,允许开发者根据需求选择XML或注解方式...
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private Set<Order> orders; ``` 这里`CascadeType.ALL`表示在保存或删除用户时,也会相应地保存或删除所有关联的订单。 ### 6. 性能优化 在一对多...
- `cascade`只能设置为`insert-update`。 - **示例**: - `group1.getRoles().add(role1);` - `role1.getGroups().add(group1);` - 分别保存`role1`和`group1`。 #### 十一、VO与PO的转换 - **VO**: View ...
- **一对多(OneToMany)**:使用`<list>`、`<set>`或`<bag>`,并通过`inverse`属性指定维护端,`cascade`属性控制级联操作。 - **多对一(ManyToOne)**:通过`<many-to-one>`标签,指定引用的目标实体类以及引用...
- 谨慎使用`inverse`属性,设置为`true`时,由子类负责维护关联,可能引发数据一致性问题。 - 使用JOIN fetch或子查询来避免N+1查询问题。 综上所述,Hibernate的一对多关联映射是实现Java对象与数据库表之间关系...
若希望关联实体与主实体一起加载,可以设置`fetch = FetchType.EAGER`。 6. **集合类型的选择**(Set/List/Bag) - 在`@OneToMany`关联中,集合类型如`Set`、`List`和`Bag`各有特点。`Set`不允许重复元素,`List`...
在多对多映射中,这两个标签用于定义关系的一端,它们包含属性如inverse(反向),cascade(级联操作),fetch(加载策略)等。 4. **中间表与关联表**: 在多对多关系中,通常需要一个中间表来存储两个实体的主键,...
4. **fetch策略**:通过`fetch`属性可以指定加载关联的方式,如`FetchType.LAZY`(懒加载)和`FetchType.EAGER`(立即加载)。默认情况下,一对多关系是懒加载的,以避免不必要的性能开销。 5. **级联操作**:通过`...