关联关系映射:
表与表之间的关系:
一对多、多对多、一对一
对象之间的关系:
一对多 :A 和B
【
class A{
//一对多
private 容器<B> ...; 容器:数组Array、List、Set、Map 等,建议:set集合(无序、不重复)
}
class B{
//多对一
private A a;
}
】
多对多
【
class A{
private Set<B> setB...
}
class B{
private Set<A> setA...
}
】
一对一
【
class A{
private B b;
}
class B{
private A a;
}
】
例如:一对多:
分析:
对象:客户:public class Customer {
private Integer cid;
private String cname;
//一对多:一个客户 拥有 【多个订单】
// * 使用容器为set:无序、不重复
private Set<Order> orderSet = new HashSet<Order>();
映射文件:
<class name="cn.xxx.b_one_to_many.Customer" table="t_customer">
<id name="cid">
<generator class="native"></generator>
</id>
<property name="cname"></property>
<!-- 一对多:一个客户 拥有 【多个订单】
1.确定集合,并确定属性
2.确定从表中外键的名称
3.确定集合存放对象关系及类型
-->
<set name="orderSet">
<key column="customer_id"></key>
<one-to-many class="cn.xxx.b_one_to_many.Order"/>
</set>
</class>
对象:订单
public class Order {
private Integer xid;
private String price;
//多对一:多个订单(当前订单) 属于 【一个客户】
private Customer customer;
映射文件: <class name="cn.xxx.b_one_to_many.Order" table="t_order">
<id name="xid">
<generator class="native"></generator>
</id>
<property name="price"></property>
<!-- 多对一:多个订单(当前订单) 属于 【一个客户】
1.确定属性
2.确定对用类型
3.确定当前对象Order,对应的表中外键名称
-->
<many-to-one name="customer" class="cn.xxx.b_one_to_many.Customer" column="customer_id">
</many-to-one>
</class>
注:如果想要看到两张表所呈现出来的关系,可以通过ER图得到。
持久态对象 关联的对象 也必须是持久态,否则将抛异常。
在进行双向关联时,只需要从表进行关联就可以了,因为从表会主动跟新外键,如果再让柱表进行关联,那么主表的对外键的更新就多余了
所以要在主表的配置文件中进行对外键的放权操作【inverse="true"】
级联操作:cascade
A和B存在关联关系。例如:customer.getOrderSet() ,当对A进行相应的操作时,并以对B也操作。
级联保存或更新 --> 在保存客户customer时,一并让hibernate自动的保存订单order需在Customer.hbm.xml <set cascade="save-update" >
级联删除:
查询客户、删除客户,默认情况:先将order 外键更新null,再删除客户。结果:客户没有,订单有(外键null)
// * 级联删除:在删除客户的同时,一并将订单删除了。结果:客户没有,订单也没有,需在Customer.hbm.xml <set cascade="delete">
多个配置项之间使用逗号分隔
孤儿删除:
一对多,存在一个父子关系。一方父,多方子。从表不能添加,主表不存在数据。主表不能删除,从表已经使用的数据。
查询客户、查询订单,解除客户和订单关联关系
// * 默认情况:更新从表外键为null。结果:客户存在,订单存在(外键null), 孤儿删除:当客户和订单解除关系时,一并删除订单。结果:客户存在,订单删除
级联总结:
save-update,级联保存或更新,在保存A时,一并保存B。
delete,级联删除,在删除A时,一并删除B。
delete-orphan,孤儿删除,解除关系时,一并删除B。
all ,save-update和delete组合。
all-delete-orphan ,三个组合。
多对多:
将一个多对多拆分成两个一对多,提供中间表(从表),与另外两个主表形成主外键关系,中间表提供两个字段,两个字段分别对应主表的外键。将两个外键合并在一起形成联合主键。
映射文件: <class name="cn.xxx.c_many_to_many.Student" table="t_student">
<id name="sid">
<generator class="native"></generator>
</id>
<property name="sname"></property>
<!-- 多对多:多个学生 可以学习【不同的课程】
1.确定容器,及对象
2.确定中间表的表名
3.自己(当前对象)在中间表中的外键的名称
4.确定关系、关联对象类型、关联对象在中间表的外键的名称
-->
<set name="courseSet" table="t_student_course">
<key column="student_id"></key>【此处的key为中间表中的sid主键】
<many-to-many class="cn.xxx.c_many_to_many.Course" column="course_id"【此处的key为中间表的cid主键】></many-to-many>
</set>
</class>
一对多:inverse="true" 主表放弃对从表外键维护。(一个字段 update)
多对多:inverse="true" 主表放弃对中间表记录维护。(一条记录 insert)
双向级联删除:
在多表中配置cascade=“delete”
一方放权:cascade=“delete” inverse=“true”
检索方式:
立即检索:进行查询时,立即查询所有需要。
延迟检索:进行查询时,直到需要数据时,才进行查询。
get():立即检索,方法一调用马上执行select语句。如果数据库没有数据,将返回null。
load():默认进行延迟检索,方法一调用暂时不执行select语句,直到需要除OID之外的数据时才进行查询。如果数据库没有数据,将抛异常
检索策略:
类级别检索:除OID之外,其他字段延迟。
关联级别检索:当前对象 关联 的另一个对象 是否延迟。
类级别:
Customer.hbm.xml <class name="" table="" lazy="true | false">
lazy="true" 通过load()进行查询时,将进行延迟检索。
lazy="false"通过load()进行查询时,将进行立即检索。
相关推荐
Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了满足更复杂的业务需求,Hibernate还提供了丰富的扩展功能,这就是我们今天要讨论的Hibernate-Extensions。这个...
7. **关联映射**:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)、多对多(@ManyToMany)关系的映射,方便处理对象间的关联关系。 8. **延迟加载**:Hibernate的懒加载策略可以在需要时才...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与业务对象进行解耦,简化了数据库编程。`hibernate-core`是Hibernate的核心库,包含了执行ORM功能所需的主要组件。 在Hibernate-...
其中,Hibernate作为一款功能强大的ORM框架,极大地简化了Java对象与数据库表之间的映射关系处理。而JPA(Java Persistence API)是Java EE规范的一部分,为ORM提供了标准的接口。`hibernate-jpa-2.1-api-1.0.0....
8. **延迟加载(Lazy Loading)**:Hibernate可以实现属性或关联关系的延迟加载,只有在真正需要时才从数据库中获取数据,避免了内存占用过多。 9. **增强型实体**:Hibernate 5引入了代理实体(Enhanced Entity)...
2. **集合映射**:通过一对多、多对一、多对多等关联关系,将集合属性与数据库表建立联系。 3. **排序集合**:对于需要按特定顺序存储的集合,可以使用排序集合(Sorted Collection)。 4. **双向关联**:在实体类...
在关联关系的处理上,Hibernate-annotations同样提供了丰富的注解。比如,@OneToOne、@OneToMany、@ManyToOne和@ManyToMany分别用于表示一对一、一对多、多对一和多对多的关系。这些注解允许我们轻松地定义实体之间...
6. @ManyToOne、@OneToOne、@OneToMany、@ManyToMany:定义不同类型的关联关系,如一对一、一对多、多对多。 7. @JoinColumn:用于关联关系中指定外键字段的属性。 8. @Temporal:用于日期时间类型的字段,支持...
这些示例涵盖了从基本的实体定义、配置,到复杂的查询、关联映射,通过实际操作,你可以深入理解Hibernate的工作原理和使用方法。 1. 实体管理:了解如何定义实体类,以及如何使用注解进行元数据配置。 2. 数据库...
例如,复杂的关联关系或特殊的数据库类型可能需要开发者手动调整生成的元数据文件。此外,随着JPA(Java Persistence API)和Spring Data的流行,Middlegen的角色逐渐被取代,更多开发者选择使用这些现代的解决方案...
6. @OneToMany、@ManyToOne、@OneToOne、@ManyToMany:表示不同类型的关联关系,如一对一、一对多、多对多。 7. @JoinColumn:用于指定关联字段在表中的具体列名。 8. @Temporal:处理日期和时间类型的字段,如...
讲师深入讲解了如何使用5.0.7.Final版本进行实际项目开发,包括实体类设计、配置文件设置、CRUD操作、关联映射、查询优化等关键知识点,旨在帮助学员快速掌握Hibernate的精髓。 5. 学习资源 包含的"0.txt"可能是一...
Hibernate ORM,作为Java领域最著名的对象关系映射框架之一,自诞生以来就深受开发者喜爱。2018年7月5日,Hibernate发布了其最新版本——5.3.2.Final,带来了诸多改进和新特性,为开发者提供了更为高效、稳定的持久...
7. **关联映射**:支持一对一、一对多、多对一和多对多等各种关联关系的映射,使得对象间的关联关系能够自然地反映到数据库中。 8. **延迟加载**:Hibernate的懒加载策略能有效减少数据库交互,只有在真正需要时才...
Hibernate ORM(Object-Relational Mapping)是Java领域中最受欢迎的持久化框架之一,它提供了一种便捷的方式将Java对象映射到关系数据库,从而实现了对象-关系的解耦。"hibernate-orm-master.zip"文件包含了...
Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库。`hibernate-mapping`是Hibernate配置文件中的一部分,用于定义Java对象与数据库表之间的映射关系。 1. `default-...
6. `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`: 这些注解用于定义实体类之间的关联关系,如一对一、一对多、多对一、多对多。 **三、使用步骤** 1. 引入Hibernate和Hibernate Annotations相关jar包:...
Hibernate作为Java领域中最流行的ORM(对象关系映射)框架之一,极大地简化了数据库操作。本篇将详细探讨`hibernate-annotations-3.4.0.GA`和`hibernate-entitymanager-3.4.0.GA`这两个版本中的核心知识点,尤其是...
Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层的数据存储。其核心库,即`hibernate-core`,是Hibernate框架的基础部分,包含...