Java JPA(EclipseLink)在列表中返回空值

Java JPA(EclipseLink)在列表中返回空值,java,jpa,eclipselink,Java,Jpa,Eclipselink,我不知道删除原来的问题是否合适,但在底部添加了一个更简洁的解释,希望无需审查所有细节 我收到了不一致的结果,无法找出我做错了什么。它涉及一个带有容器管理实体管理器、Java 8、EclipseLink 2.5.2、netbeans 8.0.2 IDE的EE7 web应用程序 存在映射为双向关系的父子关系: 事件表是映射到游戏的父级 @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "event") @O

我不知道删除原来的问题是否合适,但在底部添加了一个更简洁的解释,希望无需审查所有细节


我收到了不一致的结果,无法找出我做错了什么。它涉及一个带有容器管理实体管理器、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;
步骤1: 使用web界面,我创建了一个事件和一个游戏。游戏将添加到事件列表中,事件将添加到游戏中。调用em.persist(event)来保存所有内容。 ->效果很好

步骤2: 编辑事件 创建新游戏-使用em.flush()将事件添加到游戏中em.persist(game)以获取id并将其添加到事件中的游戏列表中 完成所有编辑后em.update(事件) ->数据库更新完全符合预期 ->顺便说一句,我知道在事件准备好保存以允许“退出”选项之前,不保存游戏是更好的用户体验。这是我计划要做的事情,但还没有很好地掌握这样做的最佳实践,我在cascade方面的经验好坏参半

最后,问题是: -100%的时间“第二步”与数据库正常工作,但当我检索事件进行进一步编辑时,事件在游戏列表中有一个值为null的附加条目。 -如果我一次又一次地关闭并重新启动应用程序,有时会发生,有时不会。数据库始终保持与预期完全一致 -同时使用来自同一台机器或其他机器的不同浏览器具有相同的结果 -显然,持久性缓存可能处于不一致的状态,但我无法确定我是否做错了什么或遇到了EclipseLink错误

早些时候,我报告了一个与IndirectList类和Java8相关的EclipseLink bug,因此我不确定我是否做错了什么,或者这是否类似

提前谢谢

在阅读了JPA JSR之后,我想知道我的理解是否正确。在web应用程序中使用EE容器管理的事务范围的持久上下文实质上意味着事务从对EJB的方法调用开始,以返回结束。因此,获取信息以在屏幕上显示内容是一个事务,而在用户更改后更新则是另一个事务。或者更清楚地说,我几乎总是与分离的实体一起工作

我的方法是获取实体树,让用户/管理员更新任何必要的内容,然后根据需要进行持久化、合并或删除。因为它是分离的,所以孤儿移除不起作用,所以我直接这样做,但保持关系。我还直接保留新的子对象,并假设我可以em.merge父对象,因为它已连接,应用更改,并且我的实体与数据库保持联系

这是一个公平的方法还是有缺陷


我仍然有这个问题,并可能进一步跟踪它。我有许多通过外键@manytone和@OneToMany进行双向链接的相关记录

它本质上是一个带有反向链接的简单链:

  • 实体A包含B的列表,B是A的外键
  • 实体B包含C的列表,C是B的外键
复制步骤:

  • 新的C(B和其他构造函数参数)
  • B.添加(C)
  • 在C中设置其他属性
  • em.persist(C)以确保ID
  • em.update(B)注册更新的关系
  • 包括4步在内的每一步之后,一切看起来都是正确的。我认为第二步也许应该跟在第四步之后,但我不确定这会有什么不同。 在步骤5之后

    • B具有相同的内存位置和指向C的指针
    • C已更新为引用B和A的新内存位置
    • i、 e.C中指向B和A的指针与源位置不同
    随后,当我用em.find()刷新实体时,尽管MySQL数据库反映了我的预期,但实体B在列表C中有空条目

    我显然做错了什么,损坏了EclipseLink持久性缓存。我发现唯一可以解决这个问题的方法是重新启动应用程序以删除缓存


    我已经好几个月没能解决这个问题了,如果有任何建议,我将不胜感激。

    问题最终被追踪到编码错误。特别是从em.merge()返回的引用指针在相关实体中未更新,导致多个副本并破坏持久性


    启动序列中的某些内容会影响这种损坏是否会随着列表中null的症状而变得明显,或者一切正常。这似乎是零星的,但事实上是早期腐败的结果

    如何访问游戏列表?Eclipselink中的Bug指的是与Java8 stream API结合使用的有缺陷的实现。我专门构建了一个类来克服该Bug,并在访问任何与JPA相关的内容时使用它。很抱歉,我点击上面的enter键并超时。我为每个实体构建了一个类,专门根据另一个示例中的建议来克服该Bug链接它深入并返回ActualItem,以便我可以更自由地使用Java8。本质上是日食。游戏(游戏列表)。流。。。它工作得很好,我在任何地方都使用它。
    @JoinColumn(name = "EVENT", referencedColumnName = "ID")
    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    private Event event;