Jpa 为什么在使用实体图查询将加载我的惰性属性之前,我必须从EclipseLink共享缓存中逐出我的实体?
在使用EclipseLink 2.7.4和Derby 10.14.2.0更新运行在GlassFish 5.1.0上的Jakarta EE应用程序中的实体之前,我将更新的实体与保存的实体进行比较,并记录更改。我最近注意到,我的比较代码不适用于@OneToMany关系属性和@ElementCollection属性,我跟踪到了@OneToMany和@ElementCollection属性的延迟加载问题。我能够使用fetch属性解决问题,如下所示: 获取渴望的实体Jpa 为什么在使用实体图查询将加载我的惰性属性之前,我必须从EclipseLink共享缓存中逐出我的实体?,jpa,jakarta-ee,eclipselink,derby,Jpa,Jakarta Ee,Eclipselink,Derby,在使用EclipseLink 2.7.4和Derby 10.14.2.0更新运行在GlassFish 5.1.0上的Jakarta EE应用程序中的实体之前,我将更新的实体与保存的实体进行比较,并记录更改。我最近注意到,我的比较代码不适用于@OneToMany关系属性和@ElementCollection属性,我跟踪到了@OneToMany和@ElementCollection属性的延迟加载问题。我能够使用fetch属性解决问题,如下所示: 获取渴望的实体 @Entity public clas
@Entity
public class Container implements Serializable {
@OneToMany(mappedBy = "container", fetch = FetchType.EAGER)
private List<AssetSerial> assets;
@ElementCollection (fetch = FetchType.EAGER)
private List<Reference> references;
@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@NamedEntityGraph(
name = "Container.eager",
attributeNodes = {
@NamedAttributeNode("assets"),
@NamedAttributeNode("references") })
public class Container implements Serializable {
Map<String, Object> props = new HashMap<String, Object>();
props.put("javax.persistence.loadgraph", em.getEntityGraph("Container.eager"));
Container managedContainer = em.find(Container.class, updatedContainer.getId(), props);
PersistenceUnitUtil tester = em.getEntityManagerFactory().getPersistenceUnitUtil();
logger.debug("Assets: {}", tester.isLoaded(managedContainer, "assets"));
logger.debug("References: {}", tester.isLoaded(managedContainer, "references"));
实体管理器初始化
@PersistenceContext(unitName = "MYPU")
private EntityManager em;
查找每个实体只工作一次的方法
@Entity
public class Container implements Serializable {
@OneToMany(mappedBy = "container", fetch = FetchType.EAGER)
private List<AssetSerial> assets;
@ElementCollection (fetch = FetchType.EAGER)
private List<Reference> references;
@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@NamedEntityGraph(
name = "Container.eager",
attributeNodes = {
@NamedAttributeNode("assets"),
@NamedAttributeNode("references") })
public class Container implements Serializable {
Map<String, Object> props = new HashMap<String, Object>();
props.put("javax.persistence.loadgraph", em.getEntityGraph("Container.eager"));
Container managedContainer = em.find(Container.class, updatedContainer.getId(), props);
PersistenceUnitUtil tester = em.getEntityManagerFactory().getPersistenceUnitUtil();
logger.debug("Assets: {}", tester.isLoaded(managedContainer, "assets"));
logger.debug("References: {}", tester.isLoaded(managedContainer, "references"));
Map props=newhashmap();
put(“javax.persistence.loadgraph”,em.getEntityGraph(“Container.eager”);
Container managedContainer=em.find(Container.class,updatedContainer.getId(),props);
PersistenceUnitUtil tester=em.getEntityManagerFactory().getPersistenceUnitUtil();
debug(“资产:{}”,tester.isLoaded(managedContainer,“资产”);
debug(“References:{}”,tester.isLoaded(managedContainer,“References”);
不幸的是,isLoaded测试方法仅在我第一次调用特定实体上的find方法时返回true。第二次和后续时间isLoaded返回false。我与这个问题斗争了好几个小时,确定这个问题是EclipseLink共享缓存没有遵守我传递给find方法的实体图提示。我通过在调用find之前立即从缓存中逐出实体解决了这个问题,如下所示
找到有效的方法
em.getEntityManagerFactory().getCache().evict(Container.class, updatedContainer.getId());
Map<String, Object> props = new HashMap<String, Object>();
props.put("javax.persistence.loadgraph", em.getEntityGraph("Container.eager"));
Container managedContainer = em.find(Container.class, updatedContainer.getId(), props);
PersistenceUnitUtil tester = em.getEntityManagerFactory().getPersistenceUnitUtil();
logger.debug("Assets: {}", tester.isLoaded(managedContainer, "assets"));
logger.debug("References: {}", tester.isLoaded(managedContainer, "references"));
em.getEntityManagerFactory().getCache().Recit(Container.class,updatedContainer.getId());
Map props=newhashmap();
put(“javax.persistence.loadgraph”,em.getEntityGraph(“Container.eager”);
Container managedContainer=em.find(Container.class,updatedContainer.getId(),props);
PersistenceUnitUtil tester=em.getEntityManagerFactory().getPersistenceUnitUtil();
debug(“资产:{}”,tester.isLoaded(managedContainer,“资产”);
debug(“References:{}”,tester.isLoaded(managedContainer,“References”);
现在isLoaded测试总是返回true,并且我能够在更新的实体中记录所有更改
总之,我有以下问题:
- 为什么EclipseLink不尊重我的实体图
- 手动将实体从缓存中逐出是否会遇到问题
- 有没有更好的方法来强制EclipseLink初始化我的延迟加载属性