Java oneToMany/ManyToOne对象在应用程序外部更新时会过时

Java oneToMany/ManyToOne对象在应用程序外部更新时会过时,java,jpa,eclipselink,smartgwt,glassfish-4.1,Java,Jpa,Eclipselink,Smartgwt,Glassfish 4.1,这是最近开始的,我无法找到是什么原因造成的,也无法找到修复方法。 我有两个对象通过连接相互关联 子实体: @OneToMany(mappedBy = "child", cascade={ CascadeType.PERSIST, CascadeType.MERGE }) @JoinColumn(name="CHILD_ID", nullable=false) private List<Parent> userCommunityOrganization = new ArrayList&

这是最近开始的,我无法找到是什么原因造成的,也无法找到修复方法。 我有两个对象通过连接相互关联

子实体:

@OneToMany(mappedBy = "child", cascade={ CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name="CHILD_ID", nullable=false)
private List<Parent> userCommunityOrganization = new ArrayList<Parent>();
在应用程序中查询数据的方式如下:

em.createQuery("SELECT p.child FROM Parent p "
      + "WHERE p.community.communityId = :communityId ")
      .setParameter("communityId", communityId)
      .setHint(TopLinkQueryHints.REFRESH, HintValues.TRUE);
症状:

直接在数据库中更新父字段(将状态从活动更改为非活动)-或任何其他关系

访问应用程序中的子对象, 应用程序中的父字段已过时(ex status=active),并将一直保持不变,直到服务器重新启动或应用程序重新部署

这不会影响child,重新查询时会在应用程序中为child反映对db的更新

所有实体中的所有关系都会发生这种情况。
我已尝试更改缓存:

<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.query-results-cache" value="false"/>

从JavaEE7返回JavaEE6(这是自问题开始以来唯一的系统范围的更改)

没有快乐。有什么想法吗

使用修复程序更新

我替换了这些行:

<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.query-results-cache" value="false"/>

与:


现在,在数据库中更新时,我的所有关系都处于同步状态。我使用的是toplink,即使eclipselink是TL的一个子集,我想这并没有扩展到所有参数。 query-results-cache不起任何作用,我曾经使用过命名查询,但在执行过程中添加查询提示消除了命名查询的查询缓存

但我还是会问“为什么?”。什么应用程序范围的更改会导致这种行为的更改

环境:

  • 爪哇7
  • 玻璃鱼4.1
  • JPA1.0(不要评判我)
  • toplink/eclipselink
  • gwt 2.3
  • smartgwt
  • MySql

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

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

谢谢,但正如我在问题中所说的,这直到最近才奏效。这种情况发生在整个应用程序中具有关系的所有对象上,这些查询提示保持不变。我将用解决方案更新问题,但我仍然不知道问题的原因。刷新仅适用于直接被查询的实体。您的应用程序可能直接在其他线程中查询子实体和父实体,这会导致它们独立刷新,并根据查询的时间进行刷新-但没有级联设置,引用的实体不可能用您显示的查询刷新。谢谢,但正如我在问题中所说的,这直到最近才起作用。这种情况发生在整个应用程序中具有关系的所有对象上,这些查询提示保持不变。我将用解决方案更新问题,但我仍然不知道问题的原因。刷新仅适用于直接被查询的实体。您的应用程序可能直接在其他线程中查询子实体和父实体,这会导致它们独立刷新,并根据查询的时间进行刷新-但没有级联设置,无法使用您显示的查询刷新引用的实体。TopLinkQueryHints来自哪个包?如果它来自TopLink essentials,那么它基于TopLink,而不是EclipseLink,这可能解释了为什么会忽略EclipseLink查询提示。它并没有解释为什么这样做会起作用-您确定这是“起作用”的,而不仅仅是因为您没有注意到时间问题吗?它来自oracle.toplink.essentials。这让我感觉更好,因为这本不应该起作用,但我已经确认它在我们的生产环境中确实起作用。TopLinkQueryHints来自哪个软件包?如果它来自TopLink essentials,那么它基于TopLink,而不是EclipseLink,这可能解释了为什么会忽略EclipseLink查询提示。它并没有解释为什么这样做会起作用-您确定这是“起作用”的,而不仅仅是因为您没有注意到时间问题吗?它来自oracle.toplink.essentials。这让我感觉更好,因为这本不应该起作用,但我已经确认它在我们的生产环境中确实起作用。
<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.query-results-cache" value="false"/>
<property name="toplink.cache.shared.default" value="false"/>