将数据从休眠层拉出到另一层的最佳方法是什么?

时间:2009-05-22 14:21:20

标签: java hibernate spring migration

正如我以前的帖子可以证明的那样,我正在将内存中的网络缓存性能改造成曾经完全休眠的场景。在这样做时,我遇到的问题是我处理代理对象并需要重新连接到会话,但在这样做时我还想保持可交易性。将复杂逻辑移出休眠层的最佳实践是什么?我刚刚“完全”进入休眠状态,所以这是一种相当可恶的经历。

任何使用过这种数据移动的人都可以详细说明如何克服交易问题,处理代理对象等等吗?我现在正在寻找一般资源,因为我正在努力游泳。

感谢。

2 个答案:

答案 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