【发布时间】:2020-04-27 08:51:17
【问题描述】:
我对更改实体并希望以其他方式更新它的事务方法有疑问。
首先,我使用 entitymanager 方法“get”从数据库中获取实体 A。 然后我得到一个相关实体 B 其中 A 到 B 是一对一的类型(可选)。 (所以 B 的 id 字段在 A 的表内)。现在我想通过服务方法删除实体 B。因此我必须使用 B 的 ID。
在服务方法中,我从实体管理器(现在是 B')get B。然后我从获得的B'中得到A'。然后我删除 A' 到 B' 的链接,当它通过 A'.setB(null) 后跟 serviceOfA .save(A').
然后我通过 serviceOfB.delete(B') 删除 B'。
当通过 id 删除 B 的方法完成后,我想更改实例 A 的属性。 例如,创建另一个 B 实例。现在,当我再次通过 entitymanager get A 时,hibernate 会抛出一个 org.hibernate.exception.ConstraintViolationException 对象,该对象应该添加到新添加的 B'' 实例中到A。
我认为该问题与更改实例 A' 的删除方法有关,因此无法重新加载 A。但是我怎样才能重新加载 A 的新状态呢? 请看下面:
@Transactional
public void compeleteSomething(
@NonNull String location,
@NonNull String nameOfA) throws SomeException{
A a= serviceOfA.get(nameOfA);
B b= a.getB();
someService.removeBAndLinkToA(b.getId()); // <-- maybe here is the error
B newInstanceOfB = someService.createBOn(location);
someService.setBonA(serviceOfA.get(nameOfA), newInstanceOfB); // <-- serviceOfA.get() throws error
[...]
}
这里是someService.removeBAndLinkToA(#)的方法
@Transactional
public void removeBAndLinkToA(
@NonNull Long id) {
B b = serviceOfB.get(id);
A a = b.getA();
if (a!= null) {
a.setB(null);
serviceOfA.save(a); // <-- This should cause the error?
}
serviceOfB.delete(b);
}
如何避免这个问题? 非常感谢!
【问题讨论】:
标签: java hibernate jpa transactions java-ee-8