JPA会尝试在已经持久(并且未分离)的实体上级联持续存在吗?
为了说清楚,这是我的情况:我想坚持一个新用户:
public void addUser(){
//User is an entity that is related to many Groups
//The relationship on User side is marked with cascade persist
User user = new User();
user.setName("foo");
user.setGroups(new ArrayList<Groups>());
//selectedUsers is an List of Groups previously created with persistent Groups
for(Group g : this.selectedGroups){
user.getGroups().add(this.groupDao.find(g.getId()));
}
//At this point, User.getGroups() is a list of Managed Entities
//What happens on the following line?
userDao.persist(user);
}
那么,会发生什么? JPA会尝试(再次)持久化user.getGroups()中的每个组吗?或者它会检测到这些组已经存在并只是更新新的关系吗?
如果'是,它会再次存在',我应该如何注释这种关系以使该代码正常工作?
答案 0 :(得分:3)
JPA将检测新组和已保留组之间的差异,并且只会保留新组。
编辑:回复评论
JPA可能会试图再次坚持他们,因为他们已经分离了。这意味着您必须使用merge再次附加它们或防止它们被分离。
他们成为超脱的最可能原因是他们所属交易的结束。假设您正在使用JTA并且没有做任何额外的事情,那么如果addUser不是EJB的方法而groupDao是EJB,则事务以groupDao.find调用开始,并在find返回时结束。因为默认情况下,EJB方法启动事务(如果尚未运行)。如果addUser是EJB的一个方法应该没问题,因为addUser将启动事务,groupDao.find将使用现有的事务,所以一切都发生在一个事务中。