4

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>());

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

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

4

1 回答 1

3

JPA 将检测新组和已经持久化的组之间的差异,并且只会持久化新组。

编辑:回应评论

JPA 可能会尝试再次保留它们,因为它们已被分离。这意味着您要么必须使用合并再次附加它们,要么防止它们被分离。

他们变得分离的最可能的原因是他们参与的交易的结束。假设您正在使用 JTA 并且没有做任何额外操作,那么如果 addUser 不是 EJB 的方法而 groupDao 是 EJB,则事务以 groupDao.find 调用开始,并在 find 返回时结束。因为默认情况下,如果没有一个 EJB 方法正在运行,则该方法会启动一个事务。如果 addUser 是 EJB 的一种方法,那应该没问题,因为 addUser 将启动事务,而 groupDao.find 将使用现有事务,因此一切都发生在一个事务中。

于 2012-05-13T08:09:37.023 回答