Mein Projekt verwendet Spring MVC4, Hibernate 5. Ich habe Hibernate-Transaktion mit Advice Interceptor konfiguriert, aber es Rollback nicht wie ich möchte. Bitte hilf mir, was ist das Problem mit meiner Konfiguration?Hibernate Transaction Advice im Frühjahr MVC
Alles ist mein Code wie folgt: 1. Hibernate config:
@Configuration
@EnableTransactionManagement
public class DataSourceConfiguration {
@Autowired
private Environment env;
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(
new String[] {env.getProperty("spring.hibernate.packagesToScan")});
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
Frühling Tipps Interceptor:
@Aspect @Configuration Öffentliche Klasse TxAdviceInterceptor {
private static final String TX_METHOD_NAME = "*"; @Value(value = "${tx-advice.timeout:-1}") private Integer txMethodTimeout = -1; private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.ptg.service..*.*(..))"; @Autowired private PlatformTransactionManager transactionManager; @Bean public TransactionInterceptor txAdvice() { MatchAlwaysTransactionAttributeSource source = new MatchAlwaysTransactionAttributeSource(); RuleBasedTransactionAttribute transactionAttribute = new RuleBasedTransactionAttribute(); transactionAttribute.setName(TX_METHOD_NAME); transactionAttribute.setRollbackRules( Collections.singletonList(new RollbackRuleAttribute(Exception.class))); transactionAttribute.setTimeout(txMethodTimeout); source.setTransactionAttribute(transactionAttribute); return new TransactionInterceptor(transactionManager, source); } @Bean public Advisor txAdviceAdvisor() { AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression(AOP_POINTCUT_EXPRESSION); return new DefaultPointcutAdvisor(pointcut, txAdvice()); }
}
DAO:
@Repository public abstract class GenericDaoImpl {
@Autowired private SessionFactory sessionFactory; @Override public void S save(S entity) { sessionFactory.save(entity); }
}
DaoImpl:
@Repository
public class TagDaoImpl extends GenericDaoImpl{
}
@Repository
public class PostDaoImpl extends GenericDaoImpl{
}
Service:
@Service public class PostServiceImpl {
@Autowired private PostDao postDao; @Autowired private TagDao tagDao; public void merge(Post post){ tagDao.save(); postDao.save(); }
}
oben Als Code, ich möchte, wenn postDao.save ist ein Fehler, tagDao ist auch Rollback.
Wie beabsichtigen Sie, Situationen zu behandeln, in denen Sie diferent Vermehrung oder Isolationsstufen für eine Service-Methode der Transaktion müssen? Was ist mit Fällen, in denen eine Service-Methode nicht die Notwendigkeit einer Transaktion vorschreibt? Beachten Sie, dass die Verwendung von "*" hier schlecht sein kann. – Naros