【问题标题】:Adding Entity to List Becomes Null After Addition将实体添加到列表中添加后变为空
【发布时间】:2014-04-16 14:58:45
【问题描述】:

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

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

然后,在 REST 方法中,我得到了 PrblFldr 对象,我们将从 EntityManager 中添加 PrblFldrTbl 对象,如下所示:

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 对象都是正确的。它们是新的,它们被持久化到数据库等。当我在.addAll() 方法之后检查folder.getPrblFldrTbls() 的内容时,PrblFldrTbl 对象都被正确添加了。

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

感谢您的帮助!

【问题讨论】:

    标签: java list jpa persistence eclipselink


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多