一、many-to-one关系在数据库中如何体现,在JavaBean中如何体现,在Hibernate中如何映射many-to-one关系。
1、数据库中:一个表的主健对应另一个表的外健。
2、javaBean中:一个对象包含另一个对象的一个引用,另一个对象包含这个对象的一组(集合,用set)引用。
3、在hibernate中:用set.key指定具体列。
我们以订单Order(一方)和订单项Item(多方)为例:
a、Order.hbm.xml的写法:
<class name="Order" table="ec_order">
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<property name="owner" column="owner" type="string" />
<property name="phone" column="phone" type="string" />
<property name="address" column="address" type="string" />
<set name="items" cascade="all-delete-orphan" inverse="true">
<key column="orderid" />
<one-to-many class="Item" />
</set>
</class>
注:inverse=“true”表示忽略集合一端的变化。
cascade="all-delete-orphan":这个比较麻烦一点,我们先来看看把cascade设为all的情况:在我们调用session.delete(order)时,会删除order下所有的item,但是如果调用order.getItems().remove(item),然后调用session.update(order)则不会删除此item,只会把 ec_item表中该条item记录的order_id设置为null。因此,如果想通过order.getItems.remove(item)删除对象,需要在已有级联的基础上加上“delete-orphan”。
b、Item.hbm.xml的写法
<class name="Item" table="ec_item">
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<property name="product" column="product" type="string" />
<property name="amount" column="amount" type="integer" />
<many-to-one name="order" class="Order" column="orderid"/>
</class>
inverse="true"就是在设置如果在内存中的修改或添加了这个集合中的某一个或某几个对象他不会将全部集合的信息同步到数据库,
而是只将集合中被修改的对象重新同步到数据库。
cascade属性是设置级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作,
cascade="none",cascade="save-update",cascade="delete",cascade="all" cascade="persist"
cascade="delete-orphan",cascade属性的值常用的设置为以上五项:
none就是不使用级联操作,默认级联是none。
save-update也就是只有对象保存操作(持久化操作)或者是持久化对象的更新操作,才会级联操作关联对象(子对象)。
persist就只是将级联对象也持久化到数据库。
delete对持久化对象的删除操作时会进行级联操作关联对象(子对象)。
all对持久化对象的所有操作都会级联操作关联对象(子对象)。
all-delete-orphan,在多端进行删除操作时,会再多端表中留下null空纪录,设置了级联操作为delete之会将表中表示关联的外键id置成null,
不会将这条纪录也删除掉,而把级联设置成delete-orphan就不会留有空纪录,而是级联的把相关纪录删除掉。
batch-size这个属性只能够写在set标签中,这个属性带表批量加载,也就是在加载一端的集合属性时会一次加载指定的数量的对象,
而不是默认的一个一个的加载,会提高效率,批量加载只能用于延迟加载和立即加载策略,也就是(lazy="true"或者lazy="false")。
lazy="true" 延迟加载,所谓的延迟加载,就是对一端的集合属性的加载策略,就是在不使用到集合中的对象的数据就不会真正的加载集合
中的对象数据,而是加载一个代理对象,就相当于一个空的容器。这也就是会出现LazyInitializationException异常,也就是没有初始化
这个代理的集合对象,在事先查询到了集合中的对象就会初始化这个对象,如果Session没有关闭就会在查询加载集合中的对象信息,如果
提前关闭了Session,当使用集合中的对象信息时就会有这个异常。
fetch="join",这就是使用了预先抓取策略,也就是针对关联的对象的加载策略,在使用到关联对象的信息时会再发送sql语句,如果不使
用fetch="join",就会不使用表连接而是先查出一端的关联id再一条一条的发送sql语句查询到关联对象信息,使用了fetch="join"就会使
用表连接将关联对象信息直接查寻出来的。fetch="lazy"这个是默认的设置。
注意:
在使用fetch="join"要区分开他和外连接的区别,他不会忽略配置文件中的加载策略,而使用了外连接就会忽略配置文件中使用了外连接的
一端的所有加载策略,而替之为立即加载。
例:班级 tream,身份证 Certigicate 学生 student
身份证和学生是一对一关系,班级和学生是一对多的关系。学生对身份证的加载策略是预先抓取,学生对班级是预先抓取,但是班级对学生
是延迟加载。
现在使用了外连接
Query q=session.createQuery("from Student as s left join s.team");
as 的语法是取别名的语法。
也就是使用了外连接的来查寻班级,这样就会忽略,学生对象对其所有属性除了使用外连接查寻的属性,而其余都会使用立即加载。
<property name="" column="" type="" not-null="true">,这样也就会使这个属性不能够为空值
查询对象,可以使用get()和load()方法,不过前提是必须知道该对象持久化时的唯一标识,也就是id,和这个对象的类对象。
二、多对多的映射实现(many-to-many)
一般多对多关联会拆分成两个一对多的关系来实现多对多关系,也可以通过hibernate提供的解决方案来实现。其实hibernate的实现方式是通过中间表间接的实现了多对多关系,实际上也是将多对多拆分成两个双向的一对多关系。
多对多关系XML文件的配置
<hibernate-mapping>
<class name="Course" table="course">
<set name="class" table="class_course" inverse="true"><!--设置中间表的表名-->
<key column="courseid">
<many-to-many column="classid" class="Class"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="Clazz" table="class">
<set name="course" table="class_course" cascade="save-update">
<key column="classid"/>
<many-to-many column="courseid" class="Course"/>
</set>
</class>
</hibernate-mapping>
Hibernate知识点小记
一、cascade
cascade属性是设置级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作,一对一的时候直接写在标签上,其他的要写在set标签上
cascade="none|save-update|all|all-delete-orphan"
none 就是不使用级联操作,默认级联是none。
save-update 也就是只有对象保存操作(持久化操作)或者是持久化对象的更新操作,才会级联操作关联对象(子对象)。
all 对持久化对象的所有操作都会级联操作关联对象(子对象)。
all-delete-orphan,在多端进行删除操作时,会再多端表中留下null空纪录,设置了级联操作为delete之会将表中表示关联的外键id置成null,不会将这条纪录也删除掉,而把级联设置成delete-orphan就不会留有空纪录,而是级联的把相关纪录删除掉。
二、inverse
inverse="true"就是在设置如果在内存中的修改或添加了这个集合中的某一个或某几个对象他不会将全部集合的信息同步到数据库,而是只将集合中被修改的对象重新同步到数据库
三、lazy
lazy=“true”
延迟加载,所谓的延迟加载,就是对一端的集合属性的加载策略,就是在不使用到集合中的对象的数据就不会真正的加载集合中的对象数据,而是家在一个代理对象就相当于的一个空的容器。
这也就是会出现LazyInitializationException异常,也就是没有初始化这个代理的集合对象,在事先查询到了集合中的对象就会初始化这个对象,如果Session没有关闭就会在查询加载集合中的对象信息,如果提前关闭了Session,当使用集合中的对象信息时就会有这个异常。
四、fetch
fetch=“join”,这就是使用了预先抓取策略,也就是针对关联的对象的加载策略,在使用到关联对象的信息时会再发送sql语句,如果不使用fetch=“join”,就会不使用表连接而是先查出一端的关联id再一条一条的发送sql语句查询到关联对象信息,使用了fetch=“join”就会使用表连接将关联对象信息直接查寻出来的。fetch=“lazy”这个是默认的设置。
五、多对多
写配置文件的时候要紧记一个原则就不会错了:
<key column =””>总是和本身类的主键id对应
<column=””>总是和关联类的主键id相对应
比如:
<set name="courses" table="enrollments " inverse="true" cascade="save-update">
<key column="sid"/>
<many-to-many class="Course" column="cid" />
</set>
分享到:
相关推荐
本篇将基于“学习Hibernate第二天”的主题,结合“源码”和“工具”这两个标签,深入探讨Hibernate的一对一主键关联双向映射,以及如何在实际开发中利用这一特性。 在Java对象关系映射(ORM)框架中,数据模型通常...
在使用Hibernate时,除了核心的Hibernate库,我们通常还需要引入一些第三方类库来增强其功能或满足特定需求。这里提到了三个重要的第三方库:dom4j、log4j和antlr。 1. dom4j-1.6.1.jar: Dom4j是一个非常灵活的...
《精通Hibernate 3.0(第三版)》是Java开发者深入理解对象持久化技术的一本经典教程。本书全面覆盖了Hibernate 3.0的核心概念、API以及最佳实践,旨在帮助读者掌握这一强大的ORM(对象关系映射)框架,提升开发效率...
在这个"hibernate第三方软件jar包"中,包含了对缓存、连接池等关键功能的支持。 1. **Ehcache**: Ehcache 是一个开源的内存缓存系统,用于提高应用程序性能。在Hibernate中,它可以作为二级缓存提供服务,将频繁...
**hibernate培训第三天** 在hibernate培训的第三天,我们深入探讨了这个强大的对象关系映射(ORM)框架的关键概念和技术。这天的学习主要涵盖了实体管理、持久化操作、事务处理以及查询语言等方面,旨在提升学员对...
《Hibernate入门:初识与实践》 ...总之,"hibernate第一个hibernate"项目是一个绝佳的起点,它将引导你了解并掌握Hibernate的基本概念和操作。通过实践,你可以逐步熟悉ORM思想,为后续的Java开发奠定坚实的基础。
在深入探讨Hibernate学习笔记第二天的源码之前,我们先来理解一下Hibernate的核心概念。Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象模型,大大简化了数据访问层的开发...
【hibernate第一个例子】 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本示例将引导初学者了解如何使用Hibernate进行简单的数据库连接和操作。 首先,我们需要...
通过集成第三方缓存提供商,如Ehcache,可以实现这一功能。此外,Hibernate3提供了强大的关联映射功能,如一对一、一对多、多对一和多对多关系,使得处理复杂的数据库关系变得简单。 总的来说,Hibernate3是一个...
1. **Hibernate3简介**:Hibernate3是Hibernate项目的第三个主要版本,它提供了一种对象关系映射(ORM)解决方案,允许开发人员使用面向对象的编程模型来处理关系数据库。它的目标是减少数据库访问的复杂性,提高...
- 第三天可能深入到对象状态的转换和生命周期管理,以及如何处理事务。 - 第四天可能讲解了HQL的使用,包括查询、更新、删除等操作。 - 第五天可能涉及了高级主题,如性能优化、缓存机制、Cascading和Lazy ...
**标题解析:**“hibernate的第一个例子”表明这是一个关于Hibernate框架的基础教程,主要目标是展示如何使用Hibernate进行数据持久化操作。 **描述分析:**描述提到这是一个超级简单的例子,包含一个持久化对象...
5. **第二级缓存**:除了默认的一级缓存(Session级别),Hibernate还支持二级缓存,这可以显著提高性能,特别是对于读多写少的应用。 6. **实体生命周期管理**:Hibernate自动管理对象的生命周期,包括加载、持久...
Manning出版 Java Persistence With Hibernate 第二版 清晰pdf Hibernate, an open source project that is almost 15 years old. In a recent poll, Hibernate was among the top five tools used by many Java ...
本篇将详细讲解如何在Hibernate中配置第三方数据库连接池——Proxool。 **什么是数据库连接池?** 数据库连接池在应用启动时会预先初始化一定数量的数据库连接,并将其存储起来。当应用程序需要与数据库交互时,它...
Hibernate3是Hibernate的第三个主要版本,发布于2005年,它提供了一种将Java对象与数据库表之间的映射方式,使得数据库操作更加面向对象。该框架支持多种数据库,包括MySQL、Oracle、SQL Server等,并且通过JDBC API...
第二级缓存则是在SessionFactory级别,可以跨Session共享,通常通过第三方缓存插件如Ehcache实现。 10. **Transaction管理**:Hibernate3提供了基于JTA或JDBC的事务管理机制,方便开发者在业务逻辑中处理事务,确保...
【hibernate培训第二天】——深入理解Hibernate框架 在软件开发中,ORM(Object-Relational Mapping)框架已经成为连接数据库与应用程序的重要桥梁,而Hibernate作为Java领域中的主流ORM框架,其强大而灵活的功能...
在深入探讨Hibernate学习笔记第三天的源码之前,先让我们简单了解一下Hibernate。Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了一种方便的方式来管理数据库操作。通过Hibernate,开发人员...
3. **全面性**:从基础概念到高级技术,本书内容全面覆盖了Hibernate的各个方面,适合不同层次的学习者阅读。 4. **易于理解**:尽管是一本技术性较强的书籍,但作者们努力使其内容易于理解,即使是初学者也能轻松...