Hibernate中hbm.xml文件的inverse、cascade、fetch、outer-join、lazy

inverse : 用于控制表与表之间的关系,默认值为“false”,一般在多对多或一对多双向关联中常见,例如在student和courser表中,产生一个sc表,如果我们对hbm文件中inverse值取默认,那么此时就由student和course共同维护它们之间的关系,也就是对其中任何一个表操作时,都会改变sc表。当在关系的一头将inverse设置为true,那么就将管理权交给它的对应端。例如:我们将student.hbm.xml中set或bag的属性inverse设置为true,那么就表示将控制权交给course,此时对student的任何操作都不会影响sc,只有courser能够影响sc。

 在多对多的映射中,无论哪一方维护表之间的关系,都没有太大的关系,然而在一对多的双向关联中,如果由一的那方去维护,

对一的操作就会导致在多的那方与之关联的记录都会被操作。因此我们通常在一对多的双向关联中,将表之间的维护关系交给多的那方。

 

 

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中的配置

 

注意:在集合中lazy与outer-join不能同时为true。当outer-join时,lazy的值对outer-join无影响。

 

 

 

cascade表示级联关系,用于维护表与表之间的关系操作

例如在team(一)对student(多)中,如果我们将team.hbm.xml中的set元素的属性cascade值设置为all,那么我们对team的操作,都会关联到与之对应的student上。如果我们队team进行delete操作,就会将在student中与之对应的外键置为null,save team就会save关联的student,update team 就会update关联的student的外键。如果我们在student.hbm.xml的many-to-one中设置cascade为true,那么我们对student的保存也会保存与之关联的team,但是对update和delete操作只对student本身起作用。

 

通过实践:当我们在一对多的关联中,将一的那方的配置文件中集合(set)cascade设置为all ,当我们删除一的那方时,就会导致在多的那方与之关联的外键置为null,然后才将一删除。如果此时我们将集合中的inverse设置为true,那么将会使操作失败。

 

Lazy属性有true和false两个值,表示是否延迟加载,为true时,表示是延迟加载,为false表示立即加载。例如在team和student中,如果将team.hbm.xml中的set元素lazy属性设置为true,表示当我查询team时,并没有立即查询出对应的student。

Lazy在set中默认值为true  ,在many-to-one、one-to-one中的默认值为false

 

 

 

 

当outer-join为true时,lazy的值无影响,此时用left outer join查询方式

当outer-join为false时,按照lazy方式,进行select查询

在以上情况中,fetch分别对应于join、select时,同样适用。

当fetch与outer-join同时使用时,fetch将会覆盖outer-join

 

get与load的区别:使用get方法时,会立即向数据库发送SQL语句,而load不会,load会首先产生代理,当需要用到某个对象或属性时,才会发送SQL语句,如果不存在,那么就会抛出异常。而对于get查询不存在就会得到null。

 

在关联级别类的操作中,get与load的查询方式取决于配置文件。

在类级别的操作中,get方法会立即发送一个SQL语句,而load任然在我们使用属性时才发送SQL语句。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值