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

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

    //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() 中的每个组吗?或者它会检测到这些组已经存在并更新新的关系?
如果“是的,它将再次持续存在”,我应该如何注释这种关系以使该代码正常工作?

最佳答案

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

编辑:回应评论

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

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

关于jpa - JPA 会尝试级联持久化和已经持久化的实体吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10554823/

相关文章:

java - Spring JPA Hibernate 优点和教程

architecture - DDD-聚合根/在这种情况下我的内部实体是否需要本地身份?

SQL Server : drop table cascade equivalent?

java - 把Spring中的JpaRepository暴露给客户端可以吗?

java - JPA表中的ID是强制的吗?

java - 使用 GenerationType.SEQUENCE 生成负 Id 值

mysql - 错误 : Call to a member function setStats() on a non-object

forms - symfony2 表单中找不到实体错误

hibernate - 单向 ManyToOne : Why transient instance saved with CascadeType. ALL 但不是 CascadeType.PERSIST

java - JPA 级联创建紧密耦合