繁体   English   中英

Spring Transactional Annotation

[英]Spring Transactional Annotation

我正在尝试更好地处理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);
   }

}

我甚至不确定是否需要合并调用。 Spring如何知道要使用哪个EntityManager,因为UserServiceImpl类中没有EntityManager声明?

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

Spring如何知道要使用哪个EntityManager,因为UserServiceImpl类中没有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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM