我在我的项目中使用 spring 3.2 和 Hibernate 4。当我查询表时,我收到“未找到当前线程的会话”消息。我尝试使用@Transactional 注释(它会成功),但我不想将@Transactional 放到每个服务实现中。
还有其他方法吗?
换句话说,“我如何在不使用@Transaction 的情况下进行简单的“插入”操作?”
谢谢...
我在我的项目中使用 spring 3.2 和 Hibernate 4。当我查询表时,我收到“未找到当前线程的会话”消息。我尝试使用@Transactional 注释(它会成功),但我不想将@Transactional 放到每个服务实现中。
还有其他方法吗?
换句话说,“我如何在不使用@Transaction 的情况下进行简单的“插入”操作?”
谢谢...
你不应该有@Transactional
你的 DAO 方法,事实上你不应该直接访问你的 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)
}
@Transactional 用于在事务中进行 java 代码调用,以便在此过程中发生任何异常时,所有数据库更改都将回滚。在理想情况下,您认为应该独立的每个服务都应该有 @Transactional 注释。Hibernate 还希望事务中的每个数据库调用,这就是为什么他们以这样一种方式实现的原因,即每个数据库查询都需要事务才能成功。我不确定您为什么希望您的服务退出事务,但他们仍想触发数据库调用。