在域/服务层和Dao层中使用此@Transactional
注释有何不同。它是否会在Domain层中提供任何优势。
答案 0 :(得分:2)
优良作法是在服务层中使用@Transactional
,因为它管理识别数据库和/或业务事务范围所需的逻辑。设计的持久层并不知道事务的范围。
DAO可以像任何其他bean一样person.updateUsername()
,但在服务层中使用它是一种常见做法。我们倾向于这样做,因为我们希望分离关注点。持久层只是从数据库中来回检索/存储数据。
例如,如果我们想将一些金额从一个帐户转移到另一个帐户,我们需要两个操作,一个帐户需要借记其他需要记入。因此,这些操作的范围仅为服务层而非持久层所知。
持久层无法知道它所处的事务,例如采用方法{{1}}。它应该始终在它独立的交易中运行吗?没有办法知道,这取决于调用它的业务逻辑。
这里有一些你应该阅读的主题
答案 1 :(得分:0)
您使用的地点@Transactional
注释指定了交易的范围。
在DAO层中使用它时,您指定将在事务中提交每个DAO操作。
在服务中使用它时,您指定在事务中提交每个服务操作(业务单位),这是建议的,因为通常服务方法表示应包含在同一事务中的业务单位,因为任何故障都应该回滚整个业务部门。
答案 2 :(得分:0)
@Transactional:需要考虑两个独立的概念,每个概念都有自己的范围和生命周期:持久化上下文,数据库事务 看起来你更喜欢数据库牵引力:
@Transactional注释本身定义了单个数据库事务的范围。数据库事务发生在持久化上下文的范围内。
持久化上下文在JPA中是EntityManager,使用Hibernate Session在内部实现