0

我正在实现一种需要长时间运行的作业的 JobProcessor。这些作业使用的信息基本上PagePageFieldPageRelation,这些信息定义了一个页面树,每个页面都有自己PageField的 s。

tl;dr 如何轻松地从 Hibernate 复制对象结构以在事务外部使用?

更多详情:

我使用 Hibernate 来持久化这些对象,一切正常。目前,我在手动控制事务的 VM 中运行 JobProcessor:

    this.em.getTransaction().begin();
    job.start();
    this.em.getTransaction().commit();

我有时需要页面上的信息,我可以像这样检索它们:

    this.em.getTransaction().begin();
    Page page = this.withId(pageId)
    this.em.getTransaction().commit();

不知何故,我很幸运从未遇到过 LazyInitialization 异常;我相信是因为 HibernateSession 永远不会关闭。

现在我要转移到 Spring 控制的环境,并尝试使所有事务简短而干净。我需要 的对象树Page,即长期运行方法中的所有字段、关系和字段。我认为最好的方法是制作树的防御性副本。这怎么能轻松实现?还是有更好的方法来处理这个问题?

4

1 回答 1

1

所以就像你说的,Hibernate 试图推迟获取数据,直到你需要它,这通常对性能有好处。

以下是一些解决方案:

1) 如果您知道您将始终需要整个页面树,您可以使用 Hibernate 查询和您需要的子实体的 fetch join(而不是只执行 session.get())。这将强制 Hibernate 填充子元素。

2)如果您首先需要每个页面的高级信息,并且当用户采取某些操作(例如单击特定页面)时只需要树的其余部分,那么当用户选择该页面时,您可以使用页面 id 来获取特定页面的子元素,也可能使用 Hibernate 查询。

于 2013-04-19T23:14:19.793 回答