我对@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
放在子类中而不是放在基类中更好?
1条答案
按热度按时间wwodge7n1#
我已经调查过了,因为
@Transactional
是一个继承的注解,如果我们用@Transactional
标记一个基类,那么它的所有子类也会自动成为@Transactional
。内置的注解documentation:
指示自动继承注解类型。如果注解类型声明中存在继承的元注解,并且用户查询类声明中的注解类型,而类声明中没有此类型的注解,则将自动查询该类的超类以获得注解类型。将重复此过程,直到找到此类型的注解。或者到达类层次结构的顶部(Object)。如果没有超类具有此类型的注解,则查询将指示所讨论的类没有此类注解。请注意,如果已注解的类型用于注解类以外的任何内容,则此元注解类型无效。
还要注意,这个元注解只导致注解从超类继承;实作界面上的注解没有任何作用。