【发布时间】:2013-05-16 07:33:13
【问题描述】:
在我的示例中,我有一个 Hibernate 实体和一个 DAO。
@Entity
@Table(name="myEntity")
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private long id;
@Column(name="action")
private String actionName;
}
...................
@Repository("myDAO")
@Transactional(propagation = Propagation.REQUIRED)
public class MyDAO {
@Autowired
private SessionFactory sessionFactory;
public void saveObject(MyEntity myEntity){
sessionFactory.getCurrentSession().save(myEntity);
}
}
当我以这种方式在 Service 中使用 DAO 时
@Service("myService")
@Transactional(propagation = Propagation.REQUIRED)
public class MyService
{
@Autowired
private MyDAO myDAO;
public void executeTransaction(){
MyEntity myEntity = new MyEntity();
myEntity.setActionName("Action1");
myDAO.saveObject(myEntity);
// myEntity = new MyEntity();
myEntity.setActionName("Action2");
myDAO.saveObject(myEntity);
}
}
只有一行(Action2)保存在数据库中。当我删除评论时,两行(Action1 和 Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法执行事务())执行。为什么在服务层上没有事务注释,两行都保存在数据库中,并且只有最后一个与此注释一起保存?
【问题讨论】:
-
不要将 DAO 类标记为事务性的。我认为事务属于服务层。它了解工作单元和用例。如果您将多个 DAO 注入到需要在单个事务中协同工作的服务中,这将很有帮助。
标签: java spring hibernate spring-transactions