hibernate中hbm.xml<many-to-one><one-to-many>中一些属性详解

在数据库中,on delete和on update有4中情况如下:


on update 和 on delete 后面可以跟的词语有四个
no action , set null , set default ,cascade
no action 表示 不做任何操作,
set null 主数据删除的时候,从属数据不会删除,只是将从属数据的关联属性字段设置成NULL,从而变为无主待关联数据,这个常用于弱耦合关系中。
set default 表示设置为默认值
cascade 表示级联操作,就是说,如果主键表中被参考字段更新,外键表中也更新,主键表中的记录被删除,外键表中改行也相应删除;在主数据删除的时候,从属数据一并删除,常用于强耦合关系中。

====================================================================

在hbm.xml中有如下配置 

<many-to-one lazy="false"
class="类路径" fetch="select" name="名称">
<column name="与哪个字段关联" />
</many-to-one>


设置 inverse=”false” cascade=”save-update” ,删除父表记录时,子表对应外键置空。



设置 inverse=”false” cascade=”all”,删除父表记录时,子表级联删除。




1. Hibernate 级联关系说明 - 关于cascade和inverse的用法


在hibernate中一对多关联时会经常用到inverse和cascade属性 ,


inverse 有两个值 true ,false  ;如果设置为true 则表示当前对象不负责讲级联对象的状态变化同步到数据库 ;设置false则相反,其默认值为false;我们将student.hbm.xml中set或bag的属性inverse设置为true,那么就表示将控制权交给course,此时对student的任何操作都不会影响sc,只有courser能够影响sc。




cascade 有五个选项 分别是: all ,delete ,none,save-update,delete-orphan ;
all : 所有情况下均进行关联操作。
none:所有情况下均不进行关联操作。这是默认值。
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete时进行关联操作。
delete-orphan: 当save/update/saveOrUpdate时,相当于save-update ;当删除操作时,相当于delete ;


all的意思是save-update + delete
all-delete-orphan 的意思是当对象图中产生孤儿节点时,在数据库中删除该节点
all比较好理解,举个例子说一下all-delete-orphan:
Category与Item是一对多的关系,也就是说Category类中有个Set类型的变量items.
举个例子,现items中存两个Item, item1,item2,如果定义关系为all-delete-orphan
当items中删除掉一个item(比如用remove()方法删除item1),那么被删除的Item类实例
将变成孤儿节点,当执行category.update(),或session.flush()时
hibernate同步缓存和数据库,会把数据库中item1对应的记录删掉


fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询; 而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。 如果你的关联对象是延迟加载的,它当然不会去查询关联对象。
Fetch只对于get或load或creteria起作用,对HQL并不起作用,除非在HQL显示指定join
 
outer-join关键字(many-to-one的情况)
outer-join关键字有3个值,分别是true,false,auto,默认是auto。
true: 表示使用外连接抓取关联的内容,这里的意思是当使用load(OrderLineItem.class,"id")时,Hibernate只生成一条SQL语句将OrderLineItem与他的父亲Order全部初始化。
select * fromOrderLineItem o left join Order p on o.OrderId=p.OrderId  where o.OrderLineItem_Id=?
false:表示不使用外连接抓取关联的内容,当load(OrderLineItem.class,"id")时,Hibernate生成两条 SQL语句,一条查询OrderLineItem表,另一条查询Order表。这样的好处是可以设置延迟加载,此处要将Order类设置为 lazy=true。
select * fromOrderLineItem o where o.OrderLineItem_Id=?
select * from Orderp where p.OrderId=?
auto:具体是ture还是false看hibernate.cfg.xml中的配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值