【问题标题】:What is the BEST way to pull data out of the hibernate layer and into another tier?将数据从休眠层拉到另一层的最佳方法是什么?
【发布时间】:2009-05-22 14:21:19
【问题描述】:

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

任何从事过这种数据移动的人能否详细说明您是如何克服事务问题、处理代理对象等的?我现在只是在寻找一般资源,因为我正在努力游泳。

谢谢。

【问题讨论】:

    标签: java hibernate spring migration


    【解决方案1】:

    你需要决定两件事:

    • 您的会话管理策略
    • 您的相关抓取策略

    Gavin King 的 post 很好,解释了处理会话的一些选项(这篇文章是关于性能的,但通常也适用)。

    至于获取,需要考虑的一件事是增加 Hibernate 层可用的原语数量。例如。假设您有一个实体 Foo 与 Bar 具有 1-N 关系,在某些情况下您只需要 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");
            //...
        }
    

    这有 2 个好处,1 您不会处理延迟加载的代理对象,您将拥有您需要的所有数据,并且它会执行得更好,因为生成的 SQL 将更适合这种情况。然而,它有一个缺点,您需要在调用 Hibernate 层之前知道您是否需要更深层次的数据。为确保您的数据保持一致(交易的主要目的),请确保您至少使用optimistic locking

    【讨论】:

      【解决方案2】:

      我认为您指的是“修改分离的对象”的做法?通常这是使用 session.merge() API 完成的。

      见:http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#objectstate-detached

      HTH

      【讨论】:

        猜你喜欢
        • 2011-06-05
        • 1970-01-01
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多