我创建了一堆新的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
再去取一切东西;当我坚持下去时,它应该留下来!知道是什么导致了这个吗?
感谢您的帮助!
答案 0 :(得分:0)
看起来我解决了自己的问题......有点儿。我知道EclipseLink默认所有关系都是懒惰加载的,这就是我想要的。但是,我假设当我调用folder.getPrblFldrTbls()
时,它会再次加载相关的PrblFldrTbl
个对象。必须在持久化上下文中发生一些奇怪的事情,但是通过在FetchType.EAGER
实体的@OneToMany
对象列表的PrblFldrTbl
注释上放置PrblFldr
,我解决了这个问题
如果有人提供有关为什么在获取类型为懒惰时发生这种情况的更多信息,请分享。我宁愿不使用上面的解决方案,因为它可能会导致性能问题(我不总是需要提取PrblFldrTbl
对象列表)。