Spring @具有基类和子类的事务性

plicqrtu  于 2022-11-21  发布在  Spring
关注(0)|答案(1)|浏览(167)

我对@Transactional注解的基类和子类感到困惑。我有下面的代码,其中有几个从CustomRepository<T>基类派生的泛型子类,它实现了ICustomRepository<T>。我希望ICustomRepository<T>接口的所有方法都是事务性的。

// class ActivityCustomRepository.java
@Repository
public class ActivityCustomRepository extends CustomRepository<Activity> {
private static final String TABLE_NAME = "activity";
public ActivityCustomRepositoryImpl(ActivityRowMapperImpl rowMapper, JdbcTemplate jdbcTemplate) {
    super(TABLE_NAME, rowMapper, jdbcTemplate);
}

// class PersonCustomRepository.java
@Repository
public class PersonCustomRepository extends CustomRepository<Person> {
private static final String TABLE_NAME = "person";
public PersonCustomRepository(PersonRowMapperImpl rowMapper, JdbcTemplate jdbcTemplate) {
    super(TABLE_NAME, rowMapper, jdbcTemplate);
}   

// CustomRepository.java
@Transactional
public class CustomRepository<T> implements ICustomRepository<T> {
    private final String tableName;
    private final RowMapper<T> rowMapper;
    private final JdbcTemplate jdbcTemplate;
    @Override
    public List<T> findAll() {
        return jdbcTemplate.batchUpdate("... ", rowMapper);
    }
}

// ICustomRepository.java
public interface ICustomRepository<T> {
     List<T> findAll();
}

仅仅把@Transactional放在基类中就足够了,这样从子类调用findAll()也变成事务性的了吗?还是把@Transactional放在子类中而不是放在基类中更好?

wwodge7n

wwodge7n1#

我已经调查过了,因为@Transactional是一个继承的注解,如果我们用@Transactional标记一个基类,那么它的所有子类也会自动成为@Transactional

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
...
}

内置的注解documentation
指示自动继承注解类型。如果注解类型声明中存在继承的元注解,并且用户查询类声明中的注解类型,而类声明中没有此类型的注解,则将自动查询该类的超类以获得注解类型。将重复此过程,直到找到此类型的注解。或者到达类层次结构的顶部(Object)。如果没有超类具有此类型的注解,则查询将指示所讨论的类没有此类注解。请注意,如果已注解的类型用于注解类以外的任何内容,则此元注解类型无效。
还要注意,这个元注解只导致注解从超类继承;实作界面上的注解没有任何作用。

相关问题