Java 正确的Hibernate嵌套事务处理
我肯定我错过了什么,但我不知道到底是什么 给出以下代码片段:Java 正确的Hibernate嵌套事务处理,java,spring,hibernate,spring-transactions,transaction-isolation,Java,Spring,Hibernate,Spring Transactions,Transaction Isolation,我肯定我错过了什么,但我不知道到底是什么 给出以下代码片段: @Service public class MyClass { private MyClass self; private UserRepository userRepository; private ApplicationContext applicationContext; @PostConstruct private void init() { self = applic
@Service
public class MyClass {
private MyClass self;
private UserRepository userRepository;
private ApplicationContext applicationContext;
@PostConstruct
private void init() {
self = applicationContext.getBean(MyClass.class);
}
@Transactional
public void doA(User user) {
...
if (condition) {
self.doB(user);
throw new SecurityException();
}
user.setRandomField("x");
userRepository.save(user);
}
@Transactional(value = Transactional.TxType.REQUIRES_NEW)
public void doB(User user) {
...
userRepository.save(user);
}
}
关于@Transactional
我所知道的是,如果使用它,调用存储库.save(entity)
是多余的
我想做的是,从一个事务方法处理一个实体,如果有一个中断条件,调用一个新方法(用REQUIRES\u new
注释),该方法将更新实体的一些字段并保存它。然后根方法(doA
)抛出异常。仅供参考:@Transactional(dontRollbackOn=SecurityException.class)
在这种情况下不是选项
为了使用这个提交机制,我没有仅仅用一个方法创建一个新bean,而是将当前bean注入一个名为self
的变量中,因此我可以使用bean代理进行事务管理
奇怪的是,如果我从doB
调用中删除save
调用,当doA
事务由于SecurityException
而回滚时,doB
执行的更改也会回滚。但如果我把它放进去的话,它就可以正常工作了
我是做错了什么还是错过了什么
谢谢 尝试在doB()中不传递用户实例。
而是传递一个Id,并在内部从repo读取用户。我不确定在不同会话之间如何处理连接的实体。尝试不在doB()中传递用户实例。而是传递一个Id,并在内部从repo读取用户。我不确定在不同会话之间如何处理附加的实体。能否将您的评论作为答复发布,以便我可以接受它?:)谢谢你,伙计!就这样!不客气!