覆盖事务方法

时间:2013-12-20 18:32:00

标签: java hibernate service transactions annotations

我在服务A中使用 @Transactional 方法M.

我有service B extends A覆盖方法M。

将覆盖方法M仍然是事务性的吗?  或者我应该添加 @Transactional

2 个答案:

答案 0 :(得分:5)

您实际要问的是:继承的方法的@Transactional注释。

简答:不。方法的注释永远不会被继承。

答案很长:见this post

答案 1 :(得分:2)

大多数情况下,您可以在课程级别使用单个@Transactional。但有时您需要自定义一种方法以表现不同。在这些情况下,使用相同的@Transactional注释标记所有其他方法仍然是多余的。

Warp-persist提供了一个工具,您可以根据需要使用特定方法的特定@Transactional覆盖类的事务行为:

@Transactional
public class MyRepository {
public void save(Thing t) { .. }

@Transactional(rollbackOn = NoSuchEntityException.class) //optional
public void remove(Thing t) { .. }   

public Thing fetch(Long id) { .. }
}

在上面的示例中,save()和fetch()具有在类级别指定的标准事务行为。但是remove()有一个特定的rollbackOn子句,而不是使用它。

请记住,无法拦截私有方法以进行事务包装。这是因为您无法覆盖子类中的私有方法。如果遇到任何此类方法,将默默忽略它们。