gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:35:19 31 4
gpt4 key购买 nike

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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com