Hibernate映射关系

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显示下配置

    驱动类名称

    连接的路径 JDBCMySQL//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

交出控制权,falsem默认不交出控制权。

  在hibernate中 ,双方都不维护关系的更新,这也是不

inverse决定谁掌有控制权,及表之间的关系行的。 

 

.inversecascade的区别

   作用的范围不同: 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,通常情况下都不会使用。特别是删除,一定要慎重。

 

.hibernatelazy的使用

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

getload的区别:

* get不支持延迟加载,而load支持。

当查询特定的数据库中不存在的数据时,get会返回null,而load则抛出异常

(Class)的延迟加载:

设置<class>标签中的lazy="true",或是保持默认(即不配置lazy属性)

如果lazy的属性值为true,那么在使用load方法加载数据时,只有确实用到数据的时候才会发出sql语句;这样有可能减少系统的开销。

* //不会发出查询sql

System.out.println("group id=" + group.getId());

 

   

 

 

 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值