Spring HibernateTemplate.flush()方法上的TransactionRequiredException
创建了JTA全局事务,我通过MDB从jms队列获取员工的数据,从MDB调用insertEmployee()方法,并在HibernateTemplate.flush()方法上获取TransactionRequiredException。不确定这里缺少什么,代码如下 JTA事务管理器Spring HibernateTemplate.flush()方法上的TransactionRequiredException,spring,hibernate,weblogic,jta,message-driven-bean,Spring,Hibernate,Weblogic,Jta,Message Driven Bean,创建了JTA全局事务,我通过MDB从jms队列获取员工的数据,从MDB调用insertEmployee()方法,并在HibernateTemplate.flush()方法上获取TransactionRequiredException。不确定这里缺少什么,代码如下 JTA事务管理器 @Configuration @EnableTransactionManagement public class JtaConfiguration { @Bean
@Configuration
@EnableTransactionManagement
public class JtaConfiguration {
@Bean
public PlatformTransactionManager transactionManager() throws Throwable {
WebLogicJtaTransactionManager transactionManager = new WebLogicJtaTransactionManager();
transactionManager.setTransactionManagerName("javax.transaction.TransactionManager");
return transactionManager;
}
}
@Bean
@DependsOn("transactionManager")
public LocalSessionFactoryBean sessionFactory() throws NamingException {
sessionFactory = new LocalSessionFactoryBean();//new AnnotationSessionFactoryBean();
Properties props = new Properties();
sessionFactory.setDataSource(dataSource());
sessionFactory.setAnnotatedClasses(Employee.class);
props.put(SHOW_SQL, "false");
props.put("hibernate.format_sql", "true");
props.put(HBM2DDL_AUTO, "none");
props.put(DIALECT, "org.hibernate.dialect.Oracle10gDialect");
props.put("javax.persistence.validation.mode", "none");
props.put("hibernate.id.new_generator_mappings", "true");
props.put("hibernate.transaction.jta.platform", WeblogicJtaPlatform.class.getName());
props.put("javax.persistence.transactionType", "JTA");
sessionFactory.setHibernateProperties(props);
return sessionFactory;
}
@Transactional(propagation =Propagation.REQUIRES_NEW, rollbackFor=Exception.class)
public long insertEmployee(Data data) {
Employee Employee = new Employee();
Employee.setId(data.getId());
Employee.setName(data.getName());
Employee.setSalary(data.getSalary());
try {
getHibernateTemplate().save(Employee);
} catch (DataIntegrityViolationException |ConstraintViolationException sqlEx) {
logger.error("DUPLICATE MESSAGE" );
} finally {
try {
getHibernateTemplate().flush();
} catch (DataIntegrityViolationException sqlEx) {
}
}
return Employee.getId();
}
MDB
@TransactionManagement(TransactionManagementType.CONTAINER)
public class DataReceiver implements MessageListener {
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void onMessage(Message message) {
//get data from message and insert using below method
insertEmployee(Data data)
}
}