如果我在类级别上有一个标记为@Transactional
的基本Dao类,这将导致Dao的每次调用都在它自己的事务中运行。
如果我在某个地方创建一个使用多个调用不同dao方法的方法怎么办?这些调用中的每一个都会在自己的事务中运行,还是会将事务包裹起来?
@Service
@Transactional
class BaseDao<T> {
//each of these methods will run in a transaction
public void save(T entity) { }
public void update(T entity) { }
}
@Service
class PersonFacade() {
//will this "wrapp" the transaction?
@Transactional
void update() {
dao.find();
dao.update();
}
}
如果它被包装了,你会认为它是一个在泛型Dao类上有@Transactional
注释的好习惯,这样dao可以直接用作@Autowired BaseDao<Person>
来管理CRUD操作吗?并且只有在需要时,创建包含需要在单个事务中运行的多个crud调用的外观?
或者我应该从基础dao中删除该事务更好吗?
答案 0 :(得分:1)
如果将两个调用都包装到一个也标记为@Transactional的方法中,那么只有一个事务可以跨越所有内容。
我认为DAO类不应该有@Transactional注释。将它们放入提供“业务方法”的Service类中。只有那些知道哪个DAO方法调用(可能来自多个实体)才能组成有意义的事务。