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的外键
- B具有相同的内存位置和指向C的指针
- C已更新为引用B和A的新内存位置
- i、 e.C中指向B和A的指针与源位置不同
我已经好几个月没能解决这个问题了,如果有任何建议,我将不胜感激。问题最终被追踪到编码错误。特别是从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;