EclipseLink在持久化

时间:2016-12-20 11:44:29

标签: java jpa eclipselink

情况:
我有两个与onetomany / manytoone关系相关的实体。

@Entity
public class EntityA{
  @ManyToOne()
  @JoinColumn(name="tableb_fk_id")
  private EntityB entityB;
}

@Entity
public class EntityB{
  @OneToMany(mappedBy="entityB")
  private List<EntityA> entityAList;
}

想象一下,每个班级都会有一个叫做id和getter以及setter的PK。

这就是我坚持并阅读它们的方式:

public void persist(Object entity){
  entityManager.getTransaction().begin();
  entityManager.persist(entity);
  entityManager.getTransaction().commit();
}

public EntityB getEntityB(Object id){
  entityManager.getTransaction().begin();
  EntityB entity = entityManager.find(EntityB.class, id);
  entityManager.getTransaction().commit();
  return entity;
}

现在要获取与持久化EntityA相关的持久化EntityB,我将调用以下内容:

getEntityB(entityA.getEntityB().getId());

问题:
如果我创建EntityA的实例并设置与已存在的EntityB实例的关系并持久保存此新实例,则所有数据都会正确保存到数据库中。但是如果我从我的EntityManager请求EntityB的实例,它将不会在其列表中包含EntityA的刚刚持久的实例。如果我重新加载我的持久层并用数据库中的数据刷新它,它就在那里。

EntityA newEntityA = new EntityA();
EntityB existingEntityB = getEntityB(5); // just an example
newEntityA.setEntityB(existingEntityB);
perstist(newEntityA);
EntityB entityBforEntityA = getEntityB(newEntityA.getEntityB().getId());
entityBforEntityA.getEntityAList(); // <- does not contain newEntityA unless i restart

问题:
为什么我的EclipseLink不会更新新持久的关系,我怎么能这样做呢?

1 个答案:

答案 0 :(得分:0)

今天偶然发现了这一点。让我欢迎我加入俱乐部。

正如其他答案所指出的,这是一个缓存问题。您可以通过强制EntityManager直接从数据库获取实体来解决此问题,而不必禁用共享缓存:

SomeEntityWithRelationship ent = em.find(SomeEntityWithRelationship.class, "someEntityPK", Map.of("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS));

另一个选择是简单地使用关系,而不是直接保留相关实体。即如果SomeEntityWithRelationship有一个Set<RelatedEntity>,请直接添加到该Set<RelatedEntity>中,而不是手动实例化一个RelatedEntity并在其上调用entityManager.persis(relEntity)

示例使用eclipselink。