java - Spring 中的嵌套传播

标签 java spring hibernate nested propagation

我正在尝试学习如何使用 Hibernate 和 Spring 并遇到了一些问题。想检查我自己的皮肤 Propagation.NESTED 是如何工作的。这是我的代码:

@Component
@Transactional
public class CompanyServiceImpl implements CompanyService {
    @Autowired
    private CompanyDao dao;
...
    @Override
    public void testNested(int id,String name) {
        User user=dao.getUser(id);
        user.setName(name);
        notValidNested(id,name+"new");
    }

    @Override
    @Transactional(propagation=Propagation.NESTED)
    public void notValidNested(int id,String name) {
        dao.getUser(id).setName(name);
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
}

@Component
public class CompanyDaoImpl implements CompanyDao {

    @PersistenceContext
    private EntityManager em;
...
    @Override
    public User getUser(int id) {

        return em.find(User.class, id);
    }
}

以及Spring的配置

@Configuration
@ComponentScan(basePackages= {"util.spring.test","service","dao"})
@EnableAspectJAutoProxy
@EnableTransactionManagement
public class SpringConfiguration {
    @Bean
      public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        System.out.println("entityManagerFactory - initialization started");
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setPersistenceUnitName("ORM");
        entityManagerFactoryBean.getJpaPropertyMap().put(BeanValidationIntegrator.MODE_PROPERTY, ValidationMode.NONE);

       return entityManagerFactoryBean;
      }

     @Bean
      public PlatformTransactionManager transactionManager() {
        System.out.println("transactionManager - initialization started");
        JpaTransactionManager transactionManager = new JpaTransactionManager(entityManagerFactory().getObject());
        transactionManager.setRollbackOnCommitFailure(true);
        return transactionManager;
      }
}

我读过一些关于 NESTED 的内容,并认为这段代码会(假设我让 companyService.testNested(7,"newName") 更改了用户的名称id 7 为“newName”。遗憾的是名称根本没有改变。如果我将 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 替换为 throw new RuntimeException(); > 并添加到注释 rollbackFor=RuntimeException.class 结果是相同的。我已经阅读了一些有关传播的内容,但遗憾的是我不知道我的代码有什么问题。 我想到的一种可能性是我的驱动程序不支持保存点(在 NESTED 中使用),但当我将 NESTED 更改为 时,也会发生同样的情况REQUIRES_NEW

最佳答案

问题是您正在调用同一个类中的方法。 Spring 没有机会拦截调用并应用 @Transactional 属性。如果您将其移至单独的类,您应该会看到您正在寻找的行为。

关于java - Spring 中的嵌套传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45195050/

相关文章:

java - : resource is not available Glassfish 4. 0 JAX-RS 2.0 的 REST 服务错误

java - Java 中的 NullPointerException 与继承

java - 如何使用 Jackson 库将 json 映射对象转换为对象数组

spring - 当在 Spring 中注入(inject) Autowiring 值时

java - 无法通过持久性删除来删除 jpa 子实体

java - 如何在 Tapestry 中延迟区域重新加载?

java - Spring 工具套件中未显示关键服务器日志消息

java - Spring中如何传递多个请求参数?

java - Spring框架中的回滚机制

java - JdbcTemplate 抛出 java.sql.SQLException :