我以前在JPA上遇到过一个问题。我有两个应用程序:主要的一个使用Java / JPA(EclipseLink),第二个使用PHP。这两个应用程序可以访问相同的数据库。现在,我正在通过Java访问“ Expedition”对象,然后通过Web服务(应该在共享数据库表“ Expedition”中修改此对象的属性)调用PHP应用程序,然后通过Java应用程序。问题是,即使在数据库中对其进行了修改,该对象似乎也没有在Java应用程序中被修改。我在考虑缓存问题。原始代码(简体):System.out.println(expedition.getInfosexpedition()); // null// Calling the web-service (modification of the "expedition" object in the database)this.ec.eXtractor(expedition);System.out.println(expedition.getInfosexpedition()); // Still null, should not be“ Expedition”和“ Infosexpedition”类的定义:远征队:@Entity@Table(name = "expedition")@XmlRootElementpublic class Expedition implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "idExpedition") private Integer idExpedition; @OneToOne(cascade = CascadeType.ALL, mappedBy = "idExpedition") @XmlTransient private Infosexpedition infosexpedition;Infosexpedition:@Entity@Table(name = "infosexpedition")@XmlRootElementpublic class Infosexpedition implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "idInfoExpedition") private Integer idInfoExpedition; @JoinColumn(name = "idExpedition", referencedColumnName = "idExpedition") @OneToOne(optional = false) @XmlTransient private Expedition idExpedition;通过执行以下操作,我已经能够使原始代码起作用:System.out.println(expedition.getInfosexpedition()); // null// Calling the web-service (modification of the "expedition" object in the database)this.ec.eXtractor(expedition);try{ // Getting explicitly the "infosExpedition" item through a simple named request Infosexpedition infos = this.ec.getFacade().getEm().createNamedQuery("Infosexpedition.findByIdExpedition", Infosexpedition.class) .setParameter("idExpedition", expedition) .setHint("eclipselink.refresh", "true") .setHint("eclipselink.cache-usage", "DoNotCheckCache") .setHint("eclipselink.read-only", "true") // This line did the trick .getSingleResult(); expedition.setInfosexpedition(infos);}catch (NoResultException nre) {}System.out.println(expedition.getInfosexpedition()); // Not null anymore, OK我试图了解这里发生的事情,为什么我必须指定一个“只读”提示才能使此工作...在此之前,我尝试了几乎所有操作,从evictAll()调用到detach() / 调用,没有任何效果。有人可以帮助我了解不同级别的缓存在这里如何工作吗?为什么我新创建的行是“只读”的?非常感谢。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 您使用的设置正在尝试绕过缓存。 (“ eclipselink.read-only”,“ true”)使它绕过第一级缓存,而((“ eclipselink.cache-usage”,“ DoNotCheckCache”)使查询转到数据库,而不是从数据库中提取数据。二级缓存。最后(“ eclipselink.refresh”,“ true”)刷新共享缓存中的数据,而不是返回预建对象。即使您对两个请求之间的对象进行了更改,您的外观也必须对两个请求使用相同的EntityManager。如评论中所述,EntityManager用于事务处理,因此您可以不受事务处理期间所做的更改的影响。如果这对您不起作用,则应在首次调用后清除或释放entityManager,以便可以接听修改Web服务后的调用。如果超出此范围的应用程序将频繁更改数据,则可能需要查看禁用共享缓存的方法,如下所示:https://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F并实现乐观锁定,以防止其中一个应用程序用陈旧数据覆盖另一个应用程序,如下所述:https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Mapping/Locking/Optimistic_Locking (adsbygoogle = window.adsbygoogle || []).push({});
07-24 09:32