【发布时间】: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