hibernate query 映射和Hibernate Query.doc
文本预览下载声明
hibernate query 映射和Hibernate Query
导读:就爱阅读网友为您分享以下“映射和Hibernate Query”资讯,希望对您有所帮助,感谢您对92的支持!
1.即时加载:
默认为true,代表加载延时加载策略,当改为false时代表不启用延时加载策略.
在hibernate2中默认为false,但在hibernate3中默认为ture,
在查询中,用对象才查询.
2.延迟加载:
演示对对象的查询,在用对象的时候,才执行操作!
演示对子表的操作,在用对象的时候,才执行操作!(one-to-many父表多条记录)
推荐:对常用字段做lazy=false,集合对象使用lazy=true;
3.预先加载:
演示out-join
4.批量加载:
演示查询子父表,不用批量加载是1+n的关系!用批量加载是1+1的关系!
在one-to-many中!循环读取子表内容时使用.
batch-size=quot;5quot;:不推荐使用非常大的值!
select * from table where id=1;
select * from table where id=2;
转换为
select * from table where id=1 or id=2;
5.List和Iterator
6.inverse:默认为false,默认为关联更新;
inverse:默认为false!所以inverse属性默认会进行“关联更新”。
inverse=false————反映;inverse=true————不反映”
当inverse在主表时,inverse为false时!
先执行insert 主,再insert 子,然后再update 子!
当inverse在主表时,inverse为true时!
先执行insert 主,再insert 子.
只对set + many-to-many设置inverse=false,其他的inverse=false。
糟糕的是,不设置inverse属性时,inverse默认为false。
在一对多关系中inverse就更有意义了。在多对多中,在哪端inverse=quot;truequot;效果差不多(在效率上)。但是在一对多中,如果要一方维护关系,就会使在插入或是删除quot;一quot;方时去updatequot;多quot;方的每一个与这个quot;一quot;的对象有关系的对象。而如果让quot;多quot;方面维护关系时就不会有update操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。让quot;多quot;方维护关系更直观一些。
DEMO SHOW:
1.inverse=quot;falsequot;
主对象包含子对象!
User u = new User();
Message message = new Message();
u.getMessages().add(message);
session.save(u);
sql语句回滚,因为调用了,一条都没有进去!
update message set USER_ID=? where id=?
(即便加入message.setUser(u),但是仍然回滚!)
2.inverse=quot;truequot;
同上,主控方在从。顺利插入user对象!
会比false少一条sql语句!
如果上面还不懂:
2.5
one-to-many的关系!
inverse=quot;falsequot;
User u = new User();
session.update(u);
结果
Hibernate: update user set userName=?, passWord=? where id=?
Hibernate: update message set USER_ID=null where USER_ID=?
2条sql语句,对父表做的任何动作,都会更新到子表中去!
inverse=quot;truequot;
User u = new User();
session.update(u);
只有一条sql语句,正常!
3.但是(之前都是没有加cascade=quot;save-updatequot;的情况!)
User u = new User();
Message message =
new Message();
u.getMessages().add(message);
message.setUser(u);//
即便加入这句话!
session.save(u);
代码仍然不能插入message!只插入了user对象!
因为你save的是user对象!除非加
显示全部