情况:
我有两个与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不更新新持久化的关系,我如何使它这样做?
今天偶然发现了这个。让我欢迎自己加入俱乐部。
正如其他答案所指出的,这是一个缓存问题。您可以通过强制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