作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!