Spring JPA:javax.persistence.TransactionRequiredException:无进行中的事务。
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(Listusers) { for (User user : users) { addUser(user.getUserName, user.getPassword); } } }
问题的原因是Spring的AOP代理不是继承而是包装了服务实例来拦截调用。这会导致在服务实例内部对"this"的任何调用都直接在该实例上调用,并且无法被包装的代理拦截(代理甚至不知道有任何这样的调用)。解决方法之一已经在上述内容中提到了。另一个巧妙的解决方法是让Spring将服务的一个实例注入到服务本身中,并在注入的实例上调用方法,这个实例将是处理事务的代理。但是要注意,如果服务bean不是单例的,这可能也会产生副作用。
如果选择这种方法(这是否是良好的设计是另一回事),并且不使用构造函数注入,请确保还查看了这个问题。
如果UserService的作用域是单例的,那会怎样?如果它是相同的对象呢?