【问题标题】:EclipseLink doesn't update entity relations after persistEclipseLink 在持久化后不更新实体关系
【发布时间】:2016-12-20 11:44:28
【问题描述】:

情况:
我有两个与 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 不更新新持久的关系,我怎样才能让它这样做?

【问题讨论】:

  • 为什么不在你正在做所有这些事情的地方发布你的持久性代码,包括事务边界,然后人们可以评论你在做什么
  • @NeilStockton 遗憾的是这是为了工作,我不允许发布实际代码。示例实体与我的实际实体一样复杂。他们只是有不同的名字。我想我也可以添加调整后的交易代码。
  • 要在 JPA 中刷新对象,您需要对其调用 refresh(),或者使用刷新查询提示执行 Query 或 find() 操作。像这样entityManager.persist(EntityA); entityManager.refresh(EntityA);
  • @SauliusNext 不是没有更新的持久化实体,而是在新实体之前已经持久化的相关实体。我更新了我的帖子

标签: java jpa eclipselink


【解决方案1】:

今天偶然发现了这个。让我欢迎自己加入俱乐部。

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

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

另一种选择是简单地使用关系而不是直接持久化相关实体。 IE。如果SomeEntityWithRelationshipSet&lt;RelatedEntity&gt;,直接添加到Set&lt;RelatedEntity&gt;,而不是手动实例化RelatedEntity 并在其上调用entityManager.persis(relEntity)

示例使用 eclipselink。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 2015-07-27
    • 2020-06-15
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多