n0w*_*eak 0 java spring hibernate jpa transactions
应用程序基于Spring 2.5.5和hibernate 3.2.0 GA.
我的DAO中有以下方法,它将MessageEntities附加到指定的User:
public MessageEntity findByUserId(int userId) {
List<MessageEntity> result = (List<MessageEntity>) em.createNamedQuery(MessageEntity.Q_BY_USER_ID).setParameter("userId", userId).getResultList();
if (!result.isEmpty()) {
return result.get(0);
} else {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我需要从集成测试中调用此方法来检查系统的行为是否有效.只要这个方法不是事务性的,我得到的就是org.hibernate.SessionException:Session被关闭了!.避免这种情况的最简单方法是使用@Transactional(readOnly = true)标记findByUserId方法.但据我了解,事务管理应该是服务层的职责,以避免不必要的事务创建.所以,我的问题是:我怎样才能正确地摆脱SessionException?
您需要在事务范围内执行所有数据库操作.当您确定通常被认为是好的设计时,让数据库模型的服务层处理事务.然后,唯一的约束就是必须调用服务模型才能进入事务范围,这在测试期间可能是不受欢迎的.
我建议使用由提供的测试 fascilites spring.请参见9.3.2.3事务管理
您也可以在测试方法之前手动创建事务,例如,通过
Session sess = factory.openSession();
Transaction tx = null;
// try catch
tx = sess.beginTransaction();
findByUserId(userId);
tx.commit();
tx.rollBack();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6738 次 |
| 最近记录: |