映射一对多关联关系
在关系数据库中,只存在外键参照关系,而且总是由"many"方参照"one"方,因为这样才能消除数据冗余,
因此关系数据库实际上只支持多对一或一对一的单向关联。
在配置文件中"多的"一方对应"一的"一方,属性不可以用<property>来配置
e.g.<many-to-one
name="customer"
column="CUSTOMER_ID"
class="com.shaogq.relational.one2more.Customer"
not-null="true"
lazy="false"
cascade="save-update"
/>
说明:
<many-to-one>元素建立了customer属性和ORDERS的外键CUSTOMER_ID直接的映射。它包含以下属性:
name:设定待映射的持久化类的属性的名字,此处为Order类的customer属性。
column:设定和持久化类的属性对应的表的外键,此处为ORDERS表的外键CUSTOMER_ID。
class:设定待映射的持久化类的属性的类型,此处设定customer属性为Customer类型。
not-null:该属性的默认值为false,如果为true,表示customer属性不允许为null。not-null属性会影响hbm2ddl工具生成的数据
库Schema。hbm2ddl工具会为ORDERS表的CUSTOMER_ID外键设置not null约束,但not-null属性不会影响hbm2java工具
生成Java源代码。此外,not-null属性还会影响Hibernate的运行时行为,Hibernate在向数据库中保持Order对象时,会
先检查它的customer属性是否为null。
lazy:如果为proxy,表示对关联的Customer对象使用延迟检索策略并且使用代理,这是默认值。
如果为false,就意味着当Hibernate从数据库中加载Order时,还会立即自动加载与它关联的Customer对象。
cascade:如果为save-update,表名保存或更新当前对象(insert/update)时,会级联保存或更新与它关联的对象。默认值为none。
映射一对多双向关联关系
Hibernate要求在持久化类中定义集合类属性时,必须把属性声明为接口类型,如java.util.Set,java.util.Map和java.util.List。
声明为接口可以提高持久化类的透明性,当Hibernate调用setOrders(Set orders)方法时,传递的参数是Hibernate自定义的实现类实例。
private Set orders = new HashSet();提高代码健壮性,避免NullPointerException
参数配置方法:
<set name="orders"
cascade="save-update"
inverse="true">
<key column="CUSTOMER_ID"/>
<one-to-many class="com.shaogq.relational.one2more.Order"/>
</set>
<set>元素包括以下属性:
name:设定待映射的持久化类的属性名,这里为Customer类的orders属性。
cascade:当取值为"save-update",表示级联保存和更新,
当取值为"delete"时表示级联删除,
当取值"all"代表两个都有,
当取值"all-delete-orphan"时,表示关联双方存在父子关系,由父方控制子方的声明周期,子方不允许单独存在。
默认值为"none"。当需要删除父方并删除与子类关系时使用,这时inverse="false"
inverse:对立,即是否维护关系,默认为false。则“一的”一方维护关系。双向一对多应该又多的一方维护关系,则应该设置为inverse="true"
子元素<key>:设定与所关联的持久化类对应的表的外键,此处为ORDERS表的CUSTOMER_ID字段
子元素<one-to-many>:设定所关联的持久化类,此处为Order类。
映射一对多双向自身关联关系
映射一对多双向自身关联关系时,仍应该有多的一方维护关系及<set>中inverse="true",
为了保证会维护关系,所以要将多的一方中的父节点赋值。
同时为了保持只需要保存根节点全部都保存,也需要将子节点保存进去(在级联的时候才会保存)。
所以只有一种配置方式
<class name="com.shaogq.relational.one2more2myself.Category" table="CATEGORY">
<id name="id" column="ID" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="name" column="NAME" type="java.lang.String"/>
<many-to-one
name="parentCategory"
column="CATEGORY_ID"
class="com.shaogq.relational.one2more2myself.Category"
not-null="false"
cascade="save-update"
/>
<set name="childCategories"
cascade="save-update"
inverse="true"
>
<key column="CATEGORY_ID"/>
<one-to-many class="com.shaogq.relational.one2more2myself.Category"/>
</set>
</class>
cascade属性说明:
cascade属性值 描述
none 当通过Session操纵当前对象时,忽略其他关联对象。它是cascade属性的默认值。
save-update 当通过Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的 新建的临时对象,并且级联更新所有关联的游离对象。
persist 当通过Session的persist()方法来保存当前对象时,会级联保存所有关联的新建的临时对象。
merge 当通过Session的merge()方法来融合当前对象是,会级联融合所有关联的游离对象。
delete 当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。
lock 当通过Session的lock()方法把当前游离对象加入到Session缓存中时,会把所有关联的游离对象也加入到Session缓存中。
replicate 当通过Session的replicate()方法复制当前对象时,会级联复制所有关联的对象。
evict 当通过Session的evice()方法从Session缓存中清除当前对象时,会级联清除所有关联的对象。
refresh 当通过Session的refresh()方法刷新当前对象时,会吉林刷新所有关联的对象。所谓的刷新是指读取数据库中相应数据,
然后根据数据库中的最新数据去同步更新Session缓存中的相应对象。
all 包含save-update,persist,merge,delete,locak,replicate,evict及refresh的行为。
delete-orphan 删除所有和当前对象接触关联关系的对象。
all-delete-orphan 包含all和delete-orphan的行为。
分享到:
相关推荐
- 对象关系映射:将Java对象与数据库表建立一对一、一对多、多对一、多对多的映射关系。 - 缓存机制:提供第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的),提高性能。 - 支持懒加载和立即加载:...
例如,一对一、一对多、多对一、多对多的关系都可以通过配置文件或注解进行映射。通过这种方式,我们可以在Java对象之间直接操作相关联的数据,而无需关心底层的SQL。 在Struts等MVC框架中整合Hibernate,可以构建...
- 在实体类设计时,通过关联属性定义一对多或多对多的关系。 - 在 XML 映射文件中使用 `<one-to-many>` 或 `<many-to-many>` 标签来配置这些关系。 - **查询操作**: - 使用 HQL(Hibernate Query Language)或 ...
5. **关系映射**:Hibernate支持多种关系映射,如一对一、一对多、多对一、多对多,通过配置文件或注解定义实体间的关联,使得对象间的复杂关系能在数据库中准确反映。 6. **Hibernate查询**:Hibernate提供HQL...
Hibernate支持多种关联映射,如一对一、一对多、多对一、多对多。在源码中,开发者可能展示了如何通过XML映射文件或注解配置这些关联,并演示了如何在代码中处理这些关系。 通过分析`hibernate_day02`的源码,我们...
#### 3.4 一对多关联 - **特点**:一个实体可以与多个实体关联。 - **实现方式**:通常使用外键。 #### 3.5 多对多关联 - **特点**:多个实体可以与多个其他实体关联。 - **实现方式**:需要创建一张中间表来存储两...
2. `@OneToMany`:一对多关系,一个实体可以有多个相关联的实体。 3. `@ManyToOne`:多对一关系,多个实体对应另一个实体的单一实例。 4. `@ManyToMany`:多对多关系,多个实体可以关联多个其他实体,通常需要一个...
- 可能会包含对复杂关联关系的处理,如多对一、一对多、多对多关系的映射。 - 可能涉及到Hibernate与其他技术的整合,如Spring、MyBatis等。 7. **进阶话题** - **Hibernate逆向工程**: 自动根据数据库表生成...
**hibernate学习笔记第四天源码解析** ...同时,还可能涉及事务管理、缓存机制、一对多、多对一、多对多的关联关系映射等进阶话题。建议结合源码仔细阅读并实践,以便更好地掌握hibernate的使用。
1. **关联的插入和更新**:在一对多关系中,如果设置`inverse="true"`,那么在保存或更新父实体时,Hibernate会自动处理与子实体的关联,添加新的子实体或更新已存在的关联。相反,如果在子实体上操作,Hibernate将...
在本篇 Hibernate 学习笔记中,我们将深入探讨多种关联关系的映射,以及相关概念。Hibernate 是一个流行的对象关系映射(ORM)框架,它允许开发者使用 Java 对象来操作数据库,简化了数据访问层的开发工作。 首先,...
标题:Hibernate学习笔记3 描述:本篇笔记深入探讨了Hibernate框架中一对多关系的映射及持久化对象状态管理,结合个人理解与实践经验,旨在为读者提供一份详实的学习资料。 ### 一、一对多关系映射详解 在...
在高级主题中,笔记会涉及一对多、多对一、一对一和多对多的关系映射。这些关系映射是ORM的核心特性,使得Java对象与数据库表之间的关联得以建立。此外,还会讲解懒加载(Lazy Loading)和即时加载(Eager Loading)...
1. 合理设计实体类,避免过多的一对多关系。 2. 使用懒加载以提高性能。 3. 使用事务管理,确保数据一致性。 4. 避免在循环中执行查询,可能导致大量数据库交互。 5. 使用二级缓存,提高应用性能。 6. 谨慎使用级联...
【hibernate学习笔记】 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它极大地简化...在实践中,还需要熟悉Criteria查询、HQL语言、事务管理、缓存策略以及多对一、一对多、多对多等关系映射的配置。
3. 一个类可以映射到多个表,反之亦然,通过配置实现多对一、一对多、多对多等复杂关系。 4. 表可以没有主键,但Java对象必须有一个标识符(通常是主键)。 5. 对象间的关联映射为表间的关系,如外键。 ORMapping...
- **一对多映射**:通过 `@OneToMany` 或 `@ManyToOne` 实现。 - **多对一映射**:通常使用 `@ManyToOne` 实现。 - **多对多映射**:通过 `@ManyToMany` 实现。 #### 九、Hibernate 查询(HQL) - **HQL**:...
- **关联映射**:一对一、一对多、多对一、多对多关系的映射处理。 - **懒加载与立即加载**:理解不同加载策略的影响。 通过以上内容的学习,你将能够熟练掌握Hibernate的使用,实现高效、便捷的数据库操作。在实际...