2017-07-19 87 views
0

我在学习如何使用Hibernate和Spring,并且遇到了一些问题。希望检查我自己的皮肤上Propagation.NESTED的工作原理。还有就是我的代码:Spring中的嵌套传播

@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并认为该代码会(让我们假设我有ID 7取得用户的companyService.testNested(7,"newName")变更名称如果我将TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();替换为throw new RuntimeException();并添加到注释rollbackFor=RuntimeException.class结果是一样的我已经阅读了一些关于传播的信息,但是我很遗憾我不知道我的错误是什么代码。 com的一种可能性ES我想到的是,我的驱动程序不支持保存点(即在NESTED使用),但同样的事情发生时,我改变NESTEDREQUIRES_NEW

回答

0

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

2

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

+0

情况就是这样。现在我只得到“JpaDialect不支持保存点 - 检查你的JPA提供者的能力”,但是在列表中它工作:)。 – ogarogar

+0

任何想法,使其工作? (Requires_NEW工作得很好)。 – ogarogar

+0

你想通过完全使用“嵌套”完成什么? “需要”会完成你想要的吗? – JustinKSU