我在项目中使用spring 3.2和Hibernate 4。当我查询表时,我得到了一个"没有找到当前线程的会话"信息。我尝试使用@Transactional注释(它获得了成功),但我不想将@Transactional放到每个服务实现中。
还有另一种方式吗?
换句话说"我怎样才能做一个简单的"插入"不使用@Transaction进行操作?"
... THX
答案 0 :(得分:2)
你的DAO方法不应该有@Transactional
,事实上你永远不应该直接访问你的DAO方法,你应该使用@Service
。服务将使用零个或多个DAO类来执行操作,只有在完成所有操作后才会提交事务。
@Repository
public class CustomerDao() {
// dao methods here, they are not transactional but will be run within a sevice transaction
}
@Service
@Transactional
public class CustomerService() {
private final CustomerDao customerDao;
@Autowired
public CustomerService(CustomerDao customerDao) {
this.customerDao = customerDao;
}
//service methods here (they are all transactional because we have annotated the class)
}
答案 1 :(得分:0)
@Transactional用于在事务中进行java代码调用,以便在进程中发生任何异常时,将回滚所有数据库更改。在理想情况下,您认为应该独立的每个服务都应该有@Transactional注释。 Hibernate还希望事务中的每个数据库调用都是为什么它们以这样的方式实现,即每个数据库查询都需要Transaction才能成功。我不确定为什么你希望你的服务没有交易仍然他们想要发起数据库调用。