并不是所有对象都适合二级缓存,King的大实话:
最适合的,是那种Reference表,数据量又少,与之相连的类又多,如区域表,角色表。
四种隔离级别:
一般在Read-write与Nonstrict-read-write 中选择,默认就还是用Read-write吧。
一般选用Ehcache作为二级缓存,并使用它的RMI分布式方案,同步发送Invalid信息实现集群同步。
Cache有三种,一般只采用前两种:
在《Hibernate in Action 2>第9章有详细介绍。Hibernate在自己Session范围内,能够保证对同一个数据库id,永远只返回同一个Java对象。只有在你在把从POST参数组装的VO或者从前一个session取得的Detached Object,与另一个代表同一个数据库对象的PO或VO放进同一个hash-base collections(如Set)中时,Java的Set才会让你郁闷一把,Set会认为这是两个对象。所以说这是hash-base collections的固有问题,Hibernate只是把它再次暴露而已。在Hibernate One Session per Request的模式下,情况还是会发生的。比如从页面参数里取得OrderItem对象,放进从数据库查出来的Order->OrderItems Set里。如果你的对象不需要放入Set(比如作为另一个对象的子对象),或者自己会在模式上避免把两个代表同一个数据库对象的对象放入同一Set中,你可以无需重载。
如果一定要重载,有三种策略
按顺序从懒到积极的四种策略。
看来Lazy,SubSelect,Eager的情况都很清晰。Batch介于Lazy与SubSelect之间,用得好时也不错。可惜不能在session级动态改变annotation,一设就是全局的了。
1. 如果在一个新建对象中插入一个新建的子对象,持久化新对象时持久化新子对象: @ManyToMany(cascade ={ CascadeType.PERSIST,CascadeType.MERGE })
2. 删除关联的子对象: @ManyToMany(cascade ={ CascadeType.REMOVE })
3. 1+2: @ManyToMany(cascade ={ CascadeType.ALL })
4. 删除一个旧对象时,如果它的子对象已经不被其他对象引用时删除,这个是Hibernate特有
@org.hibernate.annotations.Cascade( value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN )
5.@ManyToMany 级联删除JoinTable中间表的数据
如果是删除ManyToMany中的主对象,会自动删除中间表数据
如果是删除子对象(没有定义@JoinTable,只定义了mappedBy的对象),不会自动删除中间表,需要执行如下代码:
public void delete(Long id) { Role role = this.get(id); for (User user : role.getUsers()) { user.getRoles().remove(role); } super.delete(role); }
集合类对象的排序:
需要集合是可排序的,比如List,LinkedHashSet 等,注意Set与Map时,如果属性要显式初始化,要写成private Set<Role> roles = new LinkedHashSet<Role>()。如果是HashSet就依然是无序。
用@OrderBy("publishDate desc,price") 规定顺序,默认是ASC 升序,在sql中会插入相关语句.
flush的操作步骤:
Replicating方法:
session2.replicate(cat, ReplicationMode.LATEST_VERSION); 将session1的cat对象复制到session2,如果session2中已存在cat,使用其中一种策略。
批量插入与更新时:
必须定期执行session.flush(),以减少lvl 1缓存的大小。
Hibernate filters:
<class name="myClass" ...>
...
<filter name="myFilter" condition=":myFilterParam > MY_FILTERED_COLUMN"/>
</class>
session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");
但不支持按id retrive。
Fillter Collctions:
过滤对象的关联Collection,使得lazy load的user.getRoles() 不会返回所有的关联对象,可以按条件返回,分页返回。
StatelessSession:
无persistence context,因此无lvl1,2级缓存和query缓存;无自动状态检查与保存,需显式调用session.update();不获取关联对象;不调用event/inceptor。
<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description rdf:about="http://wiki.springside.org.cn/display/calvin/Hibernate+and+JPA+Notes" dc:identifier="http://wiki.springside.org.cn/display/calvin/Hibernate+and+JPA+Notes" dc:title="Hibernate and JPA Notes" trackback:ping="http://wiki.springside.org.cn/rpc/trackback/4346" /> </rdf:RDF> --><!-- Root decorator: all decisions about how a page is to be decorated via the inline decoration begins here. --><!-- Switch based upon the context. However, for now, just delegate to a decorator identified directly by the context. -->