这是最近开始的,我无法追踪是什么原因导致它或如何修复它。我有 2 个通过连接相互关联的对象
子实体:
@OneToMany(mappedBy = "child", cascade={ CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name="CHILD_ID", nullable=false)
private List<Parent> userCommunityOrganization = new ArrayList<Parent>();
父实体:
@JoinColumn(name = "CHILD_ID", referencedColumnName = "CHILD_ID")
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE },optional = false)
private Child child;
在应用程序中查询数据看起来像这样:
em.createQuery("SELECT p.child FROM Parent p "
+ "WHERE p.community.communityId = :communityId ")
.setParameter("communityId", communityId)
.setHint(TopLinkQueryHints.REFRESH, HintValues.TRUE);
症状:
直接在数据库中更新父字段(将状态从活动更改为非活动) - 或任何其他关系。
访问应用程序中的子对象,应用程序中的父字段已过时(例如状态 = 活动),并且在服务器重新启动或应用程序重新部署之前将保持这种状态。
这不会影响孩子,重新查询时,应用程序中的孩子会反映对数据库的更新。
这发生在所有实体中的所有关系上。
我试过改变缓存:
<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.query-results-cache" value="false"/>
从 javaEE 7 退回到 javaEE 6(这是自问题开始以来唯一的系统范围更改)。
没有喜悦。有任何想法吗?
更新与修复
我替换了这些行:
<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.query-results-cache" value="false"/>
和:
<property name="toplink.cache.shared.default" value="false"/>
现在我所有的关系在数据库中更新时都是同步的。我正在使用 toplink,即使 eclipselink 是 TL 的一个子集,我想这并没有扩展到所有参数。eclipselink.query-results-cache 没有做任何事情,有一次我使用的是命名查询,但在执行期间添加查询提示会消除命名查询的查询缓存。
但我仍然留下“为什么?”。什么应用范围的变化会导致这种行为变化?
环境:
- 爪哇 7
- 玻璃鱼 4.1
- jpa 1.0(不要评判我)
- toplink/eclipselink
- 重量 2.3
- 智能网关
- mysql