Hibernate映射关系
一、一对多单向配置
1.cascade属性
cascade属性的作用是描述关联对象进行操作时的级联特性。因此,只有涉及到关系的元素才有cascade属性。 具 有cascade属性的标记包括<many-to-one /> <one-to-one /> <any /> <set /><bag /> <idbag /> <list /> <array /> 注意:<ont-to-many />和 <many-to-many />是用在集合标记内部的,所以是不需要cascade属性的。 级联操作:指当主控方执行某项操作时,是否要对被关联方也执行相同的操作。
hibernate-cascade属性介绍
1).none:在保持,更新或删除当前对象时,忽略其他关联的对象。它是cascade属性的默认值。 2).save-update:当通过session的save()、update()、saveOrUpdate()方法来保持或更新当前数据时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象。 3).delete:当通过session的delete()方法删除当前对象时,级联删除所有关联的对象。 4).all:包含save-update以及delete的行为。此外,对当前对象执行evict()或lock()操作时,也会对所有关联的持久化对象执行evict()或lock()方法。 5).delete-orphan:删除所有和当前对象解除关联关系的对象。 6).all-delete-orphan:包含all和delete-orphan的行为
2.级联用户,当主控方进行操作的时候看被控对象是否存在,
如果不存在和主控方进行相同的操作
3.删除操作,在一对多中,删除多的一方则只产生两条语句,
4.配置核心控制文件
1)步骤
next->other->myeclipse->XML(basic templates)
->hibernate.cfg.xml->DTD3.0->hibernateDTD3.0
2)在source显示下配置
驱动类名称
连接的路径 JDBC:MySQL://127.0.0.1:3306/数据库的名称
用户、密码
是否在控制台显示 hibernate.show_sql
配置方言
是否在数据库中自动执行脚本文件
5.hibernate中操作的外键是对象
<many-to-one name="fk_role" class="Role(对象)"
colum="列名外键的名字"</many-to-one>
二、一对多双向配置
1.在一的一方,配置一个set 集合存放多的一方的对象集合,然后在hibernate-mapping文件中配置<set>标签,注意外键的名字和之前多的一方的外键列名相同。
(否则产生两个外键)另一个标签是<one-to-many class="多的一方的对象名字">
2.另一种是List(有序的集合)和set的配置相同。
三、双向配置中的建立关系
1.保存操作中 先保存一方后保存多方
使用一方建立联系
结果:未保存外键中内容,所以需要update语句来添加。
2.保存操作中 先保存多方后保存一方
使用一方建立联系
结果:未保存外键中内容,所以需要update语句来添加。(先保存一方后保存多方,多方维护关系《效率好》 )
3.保存操作中 只保存一方
使用一方建立联系
结果:需要进行cascade配置子在《set里》,否则将出现空指针异常。
4.删除操作中 先删除 一方
结果:做删除之前先检查关联对象的关系
5.更新操作 一对多双向配置
如果想控制反转,需要在set里配 置inverse属性为true
交出控制权,false为m默认不交出控制权。
在hibernate中 ,双方都不维护关系的更新,这也是不
inverse决定谁掌有控制权,及表之间的关系行的。
三.inverse和cascade的区别
作用的范围不同: Inverse是设置在集合元素中的。 Cascade对于所有涉及到关联的元素都有效。 <many-to-one/><one-to-many/>没有inverse属性,但有cascade属性
执行的策略不同: Inverse 会首先判断集合的变化情况,然后针对变化执行相应的处理。 Cascade 是直接对集合中每个元素执行相应的处理
执行的时机不同: Inverse是在执行SQL语句之前判断是否要执行该SQL语句 Cascade则在主控方发生操作时用来判断是否要进行级联操作
执行的目标不同: Inverse对于<ont-to-many>和<many-to-many>处理方式不相同。 对于<ont-to-many>,inverse所处理的是对被关联表进行修改操作。 对于<many-to-many>,inverse所处理的则是中间关联表 Cascade不会区分这两种关系的差别,所做的操作都是针对被关联的对象。
推荐实践:
<one-to-many>中,建议inverse=”true”,由“many”方来进行关联关系的维护 <many-to-many>中,只设置其中一方inverse=”false”,或双方都不设置 Cascade,通常情况下都不会使用。特别是删除,一定要慎重。
四.hibernate中lazy的使用
lazy,延迟加载
Lazy的有效期:只有在session打开的时候才有效;session关闭后lazy就没效了。
lazy策略可以用在:
* <class>标签上:可以取值true/false
* <property>标签上,可以取值true/false,这个特性需要类增强
* <set>/<list>等集合上,可以取值为true/false/extra
* <one-to-one>/<many-to-one>等标签上,可以取值false/proxy/no-proxy
get和load的区别:
* get不支持延迟加载,而load支持。
* 当查询特定的数据库中不存在的数据时,get会返回null,而load则抛出异常
类(Class)的延迟加载:
* 设置<class>标签中的lazy="true",或是保持默认(即不配置lazy属性)
* 如果lazy的属性值为true,那么在使用load方法加载数据时,只有确实用到数据的时候才会发出sql语句;这样有可能减少系统的开销。
* //不会发出查询sql
System.out.println("group id=" + group.getId());