2017-09-06 1 views
1

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(); 
     } 
    } 
  1. 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()); 
    } 
    

    }

  2. 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{ 
} 
  1. 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.

+0

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

Antwort

0

haben Sie @Transactional Annotation versucht?

+0

Ich möchte keine @Transactional Annotation für jeden Dienst verwenden. –

+0

Mein Projekt hat viele Dienste. Manchmal vergessen wir die add @Transactional Annotation, so ist der Fehler aufgetreten –

+0

Meine Idee ist es, den Rat Interceptor von Spring-Framework zu verwenden, um Auto/Rollback-Transaktion anstelle von @Transactional Annotation automatisch zu öffnen. –

1

Ich habe das Problem gefunden. Meine Konfiguration ist nicht falsch. Das Problem ist "Nur ungeprüfte Ausnahmen (dh Unterklassen von java.lang.RuntimeException) werden standardmäßig zurückgesetzt. Für den Fall, dass eine geprüfte Ausnahme ausgelöst wird, wird die Transaktion festgeschrieben". Ich habe meinen Code mit NullPointerException-Fehler getestet, daher wird die Transaktion nicht zurückgesetzt.

Siehe: https://www.catalysts.cc/wissenswertes/spring-transactional-rollback-on-checked-exceptions/