JPA会尝试级联持久且已经持久化的实体吗?

时间:2012-05-11 15:59:19

标签: jpa entity cascade persist

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()中的每个组吗?或者它会检测到这些组已经存在并只是更新新的关系吗?

如果'是,它会再次存在',我应该如何注释这种关系以使该代码正常工作?

1 个答案:

答案 0 :(得分:3)

JPA将检测新组和已保留组之间的差异,并且只会保留新组。

编辑:回复评论

JPA可能会试图再次坚持他们,因为他们已经分离了。这意味着您必须使用merge再次附加它们或防止它们被分离。

他们成为超脱的最可能原因是他们所属交易的结束。假设您正在使用JTA并且没有做任何额外的事情,那么如果addUser不是EJB的方法而groupDao是EJB,则事务以groupDao.find调用开始,并在find返回时结束。因为默认情况下,EJB方法启动事务(如果尚未运行)。如果addUser是EJB的一个方法应该没问题,因为addUser将启动事务,groupDao.find将使用现有的事务,所以一切都发生在一个事务中。