添加实体到列表后添加为空

时间:2014-04-16 14:58:45

标签: java list jpa persistence eclipselink

我创建了一堆新的PrblFldrTbl个对象,并将它们添加到@OneToMany对象的PrblFldr列表中。这是在Jersey REST Web服务方法中完成的,我的EntityManager是这样注入的:

@PersistenceContext(unitName="ProLabel")
private EntityManager em;

然后,在REST方法内部,我获取了PrblFldr对象,我们将PrblFldrTbl对象添加到EntityManager,如下所示:

PrblFldr folder = em.find(PrblFldr.class, folderId);

这是我创建PrblFldrTbl个对象的部分:

List<PrblFldrTbl> tablesToAdd = new ArrayList<PrblFldrTbl>();
for (PrblFldrTbl table: folder.getPrblFldrTbls()) {
    // Only adds table if it is part of the previous revision
    if (table.getPrblFldrRvsn().getFldrRvsnId() == revisionSeq - 1) {
        // Duplicates the table but sets the revision to the provided one
        // Also associates the given PrblFldr object with the new PrblFldrTbl
        PrblFldrTbl newTable = makeNewRev(table, revision, folder);
        // Persists this new PrblFldrTbl object
        em.persist(newTable);

        // ... irrelevant stuff ...

        // Add the table to the list we're going to use later
        tablesToAdd.add(newTable);
    }
}

以下是我将所有这些新PrblFldrTbl个对象添加到当前PrblFldr对象的@OneToMany列表中的部分(这样做可以防止与并发修改相关的错误):

folder.getPrblFldrTbls().addAll(tablesToAdd);

当我检查tablesToAdd列表时,所有PrblFldrTbl个对象都是正确的。他们是新的,他们被持久化到数据库等。当我在folder.getPrblFldrTbls()方法之后检查.addAll()的内容时,PrblFldrTbl对象都被正确添加。

但是有一个问题!当我在不同的服务调用中访问相同的方法(folder.getPrblFldrTbls())时,我添加到列表中的那些PrblFldrTbl个对象都变为null。一切都在数据库中持久化,一切都是正确的,但必须在持久化上下文中搞砸一些东西。我不想告诉EntityManager再去取一切东西;当我坚持下去时,它应该留下来!知道是什么导致了这个吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

看起来我解决了自己的问题......有点儿。我知道EclipseLink默认所有关系都是懒惰加载的,这就是我想要的。但是,我假设当我调用folder.getPrblFldrTbls()时,它会再次加载相关的PrblFldrTbl个对象。必须在持久化上下文中发生一些奇怪的事情,但是通过在FetchType.EAGER实体的@OneToMany对象列表的PrblFldrTbl注释上放置PrblFldr,我解决了这个问题

如果有人提供有关为什么在获取类型为懒惰时发生这种情况的更多信息,请分享。我宁愿不使用上面的解决方案,因为它可能会导致性能问题(我不总是需要提取PrblFldrTbl对象列表)。