Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正确的Hibernate嵌套事务处理_Java_Spring_Hibernate_Spring Transactions_Transaction Isolation - Fatal编程技术网

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读取用户。我不确定在不同会话之间如何处理附加的实体。能否将您的评论作为答复发布,以便我可以接受它?:)谢谢你,伙计!就这样!不客气!