1

这是最近开始的,我无法追踪是什么原因导致它或如何修复它。我有 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
4

1 回答 1

0

您正在使用刷新提示查询子级,仅强制刷新子级及其关系,而不是引用的实体。如果您希望引用的实体也被刷新,则必须使用级联刷新选项标记这些关系。

于 2016-01-11T19:17:58.663 回答