【问题标题】:Nested propagation in SpringSpring中的嵌套传播
【发布时间】:2017-12-24 23:46:03
【问题描述】:

我正在尝试学习如何使用 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”。遗憾的是,名称根本没有改变。如果我用throw new RuntimeException(); 替换TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 并添加到注释rollbackFor=RuntimeException.class 结果是一样的。我已经阅读了一些关于传播的内容,但遗憾的是我不知道我的代码有什么问题。 我想到的一种可能性是我的驱动程序不支持保存点(在NESTED 中使用)但是当我将NESTED 更改为REQUIRES_NEW 时会发生同样的事情

【问题讨论】:

    标签: java spring hibernate nested propagation


    【解决方案1】:

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

    【讨论】:

    • 就是这样。现在我只得到“JpaDialect 不支持保存点 - 检查您的 JPA 提供程序的功能”,但在列表中它可以工作:)。
    • 有什么办法让它发挥作用吗? (Requires_NEW 工作得很好)。
    • 你想通过使用“NESTED”来完成什么? “REQUIRED”会完成你想要的吗?
    【解决方案2】:

    我认为问题不在于事务,可能是分离实体的情况。更改值后尝试调用 entityManager.save() 或 entityManager.merge() 方法。

    【讨论】:

      猜你喜欢
      • 2012-10-20
      • 1970-01-01
      • 2012-09-05
      • 2022-11-04
      • 1970-01-01
      • 2012-11-27
      • 2014-10-14
      • 1970-01-01
      • 2020-09-17
      相关资源
      最近更新 更多