java - Spring 事务注解

标签 java spring spring-mvc transactions entitymanager

我正试图更好地处理 Spring 的 @Transactional 属性的使用。我知道它基本上将标记为 @Transactional 的方法的内容包装在事务中。将服务/业务层方法标记为事务性方法是否合适,而不是像我在此处所做的那样将实际的 DAO 方法标记为事务性方法?

服务实现

public class UserServiceImpl implements UserServiceInt{
   @Autowired
   private UserServiceDAO serviceDAO;


   @Override
   public User getUser(int id){
      return serviceDAO.getUser(id);
   }

   @Override
   @Transactional
   public void updateUserFirstName(int id, String firstName) throws SomeException{
      User userToUpdate = getUser(id);
      if(userToUpdate == null){
         throw new SomeException("User does not exist");
      }
      userToUpdate.setFirstName(firstName);
      serviceDAO.updateUser(userToUpdate);
   }

}

DAO 实现

public class UserServiceDAOImpl implements UserServiceDAOInt{
   @PersistenceContext(unitName="myUnit")
   private EntityManager entityManager;

   @Override
   public void updateUser(User user){
      entityManager.merge(user);
   }

}

我什至不确定是否有必要调用合并。既然 UserServiceImpl 类中没有声明 EntityManager,Spring 如何知道要使用哪个 EntityManager?

最佳答案

当服务类中的方法有多个数据库调用时,我们用 @Transactional 标记服务层,我们希望所有调用都应该发生,或者没有一个应该发生,或者我们可以说是否有任何调用失败则整个事务应该rollback。如果我们不符合这个标准,那么我们也可以在 DAO 层上选择 @Transactional

既然 UserServiceImpl 类中没有声明 EntityManager,Spring 如何知道要使用哪个 EntityManager?

Spring从persistence.xml(来自classpath)中引用了EntityManager,其结构类似于下面:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
    <persistence-unit name="myUnit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/YourDatasource</jta-data-source>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

关于java - Spring 事务注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30667972/

相关文章:

java - 单例 Bean 上的 Spring @Async

java - 验证期间未使用 Spring MessageSource

ASP.NET MVC 领域的 Java 等价物

java - 通过Java从Lotus Notes数据库 View 中检索数据

java - Spring @EnableRetry 抛出 InternalAutoProxyCreator

java - Hibernate - 访问新数据字段时无法解决属性错误

jsf - 如何在 Spring-MVC 和 JSF 混合 Web 应用程序中设置 JSF 欢迎文件

java - 注册网络应用程序后激活帐户

java - 从 Heroku 上托管的 java 应用程序运行 Heroku CLI 命令

java - 将 XML 转换为以下格式的 HTML PHP 或 Java