hibernat二级缓存在级联情况下的问题

09-02-09 axlfu

现在有A,B两个表是一对多的关系,

A的配置文件片段:

<set inverse="true" lazy="false" name="BListForA">

<cache usage="transactional"/>

<key>

<column name="A"/>

</key>

<one-to-many class="B"/>

</set>

用jbossCache做二级缓存,A表的hbm.xml文件中的BListForA对象set标签也做了cache。lazy=false.

现在问题是:

查询A表(from A),级联就把B查出来了,B_set.size()大小没问题

然后往B表插入数据,

再查A表,就不做B表查询了,B_set.size()还是第一次的大小。

这个问题应该怎么解决呢?

如何让程序在插入B表数据后能更新二级缓存?

另外,为什么最后不做B表的查询但还做A表的查询?

测试代码:

List<A> l = (List<A>)dao.findByHQL("from A");

System.out.println(l.get(0).getBListsForA().size()); //n

B e1 = new B();

e1.setA(l.get(0));

B e2 = new B();

e2.setA(l.get(0));

dao.add(e2);

dao.add(e1);

l = (List<A>)dao.findByHQL("from A");

System.out.println(l.get(0).getBListsForA().size()); //should be n+2 , but n

最后,还有一个问题:怎样才能在通过hibernate查看其使用的cache中的数据?

谢谢。

         

1
banq
2009-02-09 13:44
简单回答一下:

注意:你使用了二级缓存,这个不是hibernate缺省,Hibernate不会替你照顾,你就需要象使用Jdon框架一样自己做好缓存更新,手工更新B。

第二个问题参考第一个。

axlfu
2009-02-09 14:49
每次添加或更新B都要清除A?如果是这样的话做太麻烦了,而且也不合理,还不如在web层用memcached。

感觉hibernate的级联操作或者opensessionInView比较鸡肋。

第二个问题。。。。我查了hibernate的api,找不到操作cache的工具。jbosscache不太熟

猜你喜欢