正如我以前的帖子可以证明的那样,我正在将内存中的网络缓存性能改造成曾经完全休眠的场景。在这样做时,我遇到的问题是我处理代理对象并需要重新连接到会话,但在这样做时我还想保持可交易性。将复杂逻辑移出休眠层的最佳实践是什么?我刚刚“完全”进入休眠状态,所以这是一种相当可恶的经历。
任何使用过这种数据移动的人都可以详细说明如何克服交易问题,处理代理对象等等吗?我现在正在寻找一般资源,因为我正在努力游泳。
感谢。
答案 0 :(得分:2)
您需要决定两件事:
Gavin King有很好的post解释了处理会话的一些选项(帖子是关于性能的,但通常也适用)。
至于提取,需要考虑的一件事是增加Hibernate层提供的原语数量。例如。想象你有一个与Bar有1-N关系的实体Foo,有些情况你只需要Foo对象,但在其他情况下你需要Foos和子Bar对象。你可以将它们表示为对Hibernate层的单独调用。
class HibernateLayer {
public List<Foo> findFoo(String someCriteria) {
Query q = new Query("from Foo f where f.someCriteria = :1");
//...
}
public List<Foo> findFooWithBars(String someCriteria) {
Query q = new Query("from Foo f left join fetch Bar b where f.someCriteria = :1");
//...
}
这有两个好处,1你不会处理延迟加载的代理对象,你将拥有所需的所有数据,并且它将更好地执行,因为生成的SQL将更适合这种情况。然而,它将具有在调用Hibernate层之前需要知道的缺点,无论您是否需要更深层次的数据。为确保您的数据保持一致(交易的主要目的),请务必至少使用optimistic locking。
答案 1 :(得分:0)
我认为你指的是“修改分离对象”的做法?通常,这是使用session.merge()API完成的。
请参阅:http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#objectstate-detached
HTH