当前位置: 首页 > 知识库问答 >
问题:

EclipseLink在持久化后不更新实体关系

锺离飞尘
2023-03-14

情况:
我有两个与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;
}
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个答案

羊舌昆杰
2023-03-14

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

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

SomeEntityWithRelationship.class,“SomeEntityWithRelationship.class”,Map.of(“javax.persistence.cache.retrieveMode”,CacheRetrieveMode.bybass));

示例使用Eclipselink。

 类似资料:
  • 我已经在这个问题上工作了两天了,现在我没有主意了。 下面是entity和dao类: 抽象性: 域道: 我不认为问题出在EntityManager或dao类中,因为EntityManager(find())至少有一个方法起作用。我会很感激和帮忙的。

  • 我在JTA和Wildfly8中使用Eclipselink,问题是在提交用户事务并将数据插入数据库后,它不会更新相关实体,所以如果我重新加载页面或打开页面的新实例,它加载数据时不会插入行。

  • 对于新学生和新课程的情况,它工作得很好,但是在新课程和现有学生的情况下,我会从数据库中抛出一个唯一的约束冲突。关系类似于下面。 在持久化之前,我尝试使用entitymanager查找一个学生,如果该学生存在,则使用该实例而不是新的学生实例。这也不起作用,它仍然尝试执行插入而不是更新

  • 我更新了实体文件以包含关系映射。

  • 问题内容: 我有一个托管bean,其中包含当前页面的实体对象列表。在我创建一个新对象并在事务中使用persist()将其持久保存到数据库之后;在另一个事务中,当我调用merge时(由于该实体由于先前的事务提交而处于分离状态);实体管理器无法在持久性上下文中找到对象,并向数据库抛出选择查询。我是否缺少某些东西,或者是正常行为? 更新:当我使用mysql数据库和自动生成的ID列时,存在上述问题。当我在

  • 我有一个父实体a,它与映射在a_B表和a_C表中的实体B和实体C有多对多关系。在持久化时,我希望只持久化a、a_B和a_C,而不持久化B和C。如果我不使用cascadetype。all i get“object references a unsaved transient instance-save the transient instances before flush”错误。如果我使用casc