我不知道删除原始问题是否合适,但在底部添加了更简洁的解释,希望无需审核所有细节。
我收到的结果不一致,无法弄清楚我做错了什么。它涉及一个带有容器管理的实体管理器,Java 8,EclipseLink 2.5.2,netbeans 8.0.2 IDE的EE7 Web应用程序。
父子关系映射为双向关系:
事件表是映射到游戏的父级
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "event")
@OrderBy("gameType, round")
private List<Game> gameList;
游戏将事件映射为
@JoinColumn(name = "EVENT", referencedColumnName = "ID")
@ManyToOne(fetch = FetchType.EAGER, optional = false)
private Event event;
第1步: 使用Web界面我创建一个事件和一个游戏。游戏被添加到游戏的事件列表和事件中。调用em.persist(event)来保存所有内容。 - &GT;效果很好
第2步: 编辑活动 创建一个新游戏 - 将事件添加到游戏中,em.persist(游戏)使用em.flush()获取id并将其添加到事件中的游戏列表 完成所有编辑后em.update(事件) - &GT;数据库更新完全符合预期 - &GT;顺便说一句我明白,在事件准备好保存以允许选择退出之前,不保持游戏是一种更好的用户体验。这是我打算做的事情,但是还没有很好地处理这样做的最佳实践,而且我对级联的经验也很复杂。
最后问题: - 100%的时间&#39;第二步&#39;与数据库一起正常工作,但当我检索事件以进行进一步编辑时,事件在游戏列表中有一个值为null的附加条目。 - 如果我一次又一次地关闭并重新启动应用程序,有时它会发生,有时它不会。数据库始终保持完好,完全符合预期 - 同时使用同一台机器上的其他浏览器或其他浏览器具有相同的结果 - 显然持久性缓存CAN处于不一致状态但我无法确定我是做错了还是遇到了EclipseLink错误
之前我报告过一个problem,结果发现是与IndirectList类和Java 8相关的EclipseLink错误,所以我不确定我做错了什么或是否相似。
提前致谢!
在阅读了JPA JSR后,我想知道我的理解是否正确。在Web应用程序中使用EE容器管理的事务范围持久化上下文实质上意味着事务以对EJB的方法调用开始并以返回结束。因此,获取信息以在屏幕上放置内容是一个事务,并且在用户更改之后更新是另一个事务。或者更清楚的是,我几乎总是与分离的实体合作。
我的方法是获取实体树,让用户/管理员更新所需的任何内容,然后根据需要保留,合并或删除。由于它是分离的孤儿删除不起作用所以我直接这样做但保持关系。我也直接坚持新的孩子,并假设我可以尽可能多地为父母充实,因为它变得附加,应用变化,我的实体与数据库保持一致。
这是一种公平的方法还是以某种方式存在缺陷?
我仍然遇到这个问题,并且可能会进一步跟踪它。我通过外键@ManyToOne和@OneToMany提供了许多相关的双向链接记录。
它本质上是一个带有反向链接的简单链:
重现的步骤:
在包括4的每一步之后,一切看起来都是正确的。我想也许第2步应该遵循4但不确定它会有所作为。 在第5步之后,
随后当我使用em.find()刷新实体时,实体B在列表C中有NULL条目,尽管MySQL数据库反映了我的期望。
我显然做错了一些已经破坏EclipseLink持久性缓存的东西。我发现解决此问题的唯一方法是重新启动应用程序以删除缓存。
我几个月来都无法解决这个问题,并希望得到任何建议。
答案 0 :(得分:0)
问题最终被追踪到编码错误。具体而言,从em.merge()返回的引用指针未在相关实体中更新,从而导致多个副本并破坏持久性。
启动顺序中的某些内容会影响这种损坏是否会因列表中的空值或某些正常工作的症状而变得明显。它似乎是零星的,但实际上是早期腐败的结果。