Spring JPA:javax.persistence.TransactionRequiredException:无进行中的事务。

10 浏览
0 Comments

Spring JPA:javax.persistence.TransactionRequiredException:无进行中的事务。

我对Spring事务还不太了解。有一件事让我感到非常奇怪,可能是我理解错了。我想在方法级别上使用事务,并且在同一个类中有一个调用方法,但似乎不支持这样做,必须从另一个类中调用。我不明白这是如何可能的。如果有人知道如何解决这个问题,我将非常感激。我想在同一个类中调用带有注解的事务方法。

以下是代码:

public class UserService {
    @Transactional
    public boolean addUser(String userName, String password) {
        try {
            // 调用DAO层并将用户添加到数据库。
        } catch (Throwable e) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    
    public boolean addUsers(List users) {
        for (User user : users) {
            addUser(user.getUserName, user.getPassword);
        }
    } 
}

0
0 Comments

问题的原因是Spring的AOP代理不是继承而是包装了服务实例来拦截调用。这会导致在服务实例内部对"this"的任何调用都直接在该实例上调用,并且无法被包装的代理拦截(代理甚至不知道有任何这样的调用)。解决方法之一已经在上述内容中提到了。另一个巧妙的解决方法是让Spring将服务的一个实例注入到服务本身中,并在注入的实例上调用方法,这个实例将是处理事务的代理。但是要注意,如果服务bean不是单例的,这可能也会产生副作用。

如果选择这种方法(这是否是良好的设计是另一回事),并且不使用构造函数注入,请确保还查看了这个问题。

如果UserService的作用域是单例的,那会怎样?如果它是相同的对象呢?

0