Java 如何在事务中使用Spring、Hibernate、MySQL ISAM?

Java 如何在事务中使用Spring、Hibernate、MySQL ISAM?,java,mysql,hibernate,spring-mvc,transactions,Java,Mysql,Hibernate,Spring Mvc,Transactions,我正在一个小型个人项目中使用Hibernate和Spring。嗯,在这方面还是个新手,所以我想提出一些关于交易的基本问题 似乎我必须声明事务管理器并将DAO类注释为 @事务性(传播=propagation.REQUIRED,只读=false)。否则会出现一些奇怪的异常,或者实体没有保存在数据库中。是否确实必须使用事务?如果我不使用它们就不能将数据保存在数据库中(我认为MySQL ISAM表不支持事务),那么您将如何使用它们 放置@Transactional属性的最佳位置是什么?目前它已在我的通

我正在一个小型个人项目中使用Hibernate和Spring。嗯,在这方面还是个新手,所以我想提出一些关于交易的基本问题

  • 似乎我必须声明事务管理器并将DAO类注释为 @事务性(传播=propagation.REQUIRED,只读=false)。否则会出现一些奇怪的异常,或者实体没有保存在数据库中。是否确实必须使用事务?如果我不使用它们就不能将数据保存在数据库中(我认为MySQL ISAM表不支持事务),那么您将如何使用它们

  • 放置@Transactional属性的最佳位置是什么?目前它已在我的通用HibernateDAO超类中声明,可能是它所能达到的最深级别。我想那不是最好的地方。但是如果把它向上移动,我会把它放在SpringMVC控制器中,这可能也是不合适的地方。到目前为止,还没有其他服务层,因为除了保存和提供数据库中的单词和定义之外,我什么都不做


非常感谢

是的,您总是需要使用事务来访问使用Hibernate的数据库(甚至不使用事务)。我不会使用MyISAM,因为正如您所说,它不是事务数据库引擎

放置
@Transactional
注释的最佳位置是在服务层的功能服务上。要么介绍一个真正的服务层,要么你认为DAO层实际上是你的服务层。但是要注意,如果您的控制器必须使用FooDAO保存一个foo,使用BarDAO保存一个bar,并且如果这两个插入应该以事务方式进行,那么您就有一个大问题。这就是为什么服务层如此重要:它可以在一个事务中访问多个DAO

是否确实必须使用事务

是的。关系数据库的基本特征之一是事务。不过,使用默认参数进行简单的
@Transactional
就足够了。但是,您可以使用AOP在XML中声明事务,围绕整个类集,例如所有类都具有
*DAO
名称

放置@Transactional属性的最佳位置是什么


服务层,请参阅:。

spring hibernate事务管理器还负责为您管理hibernate会话。如果将sessionFactory.getCurrentSession()api与spring HibernatraneActionManager一起使用,spring将负责在事务开始时打开会话,并在事务结束后关闭会话

这使您的代码更干净。您不必将代码浪费在openSession和closeSession上。对于每个hibernate操作,使用每个请求的会话方法而不是打开和关闭会话也是一个好主意

正如您所提到的,将其放在服务层中是正确的位置——这些类通过调用许多DAO方法来实现用例的逻辑。如果没有DAO,则可能是从控制器执行多个DAO调用,或者是DAO在需要时执行多个db操作

如果从控制器方法调用多个DAO方法,则应在控制器方法上放置@Transactional

如果DAO正在执行多个DB操作,则应将其置于DAO级别

如果应用程序涉及非平凡逻辑(在基本CRUD之外),那么最好在此级别创建服务层和管理器事务