如何解决HibernateTemplate.flush() 方法上的 TransactionRequiredException
创建了 JTA 全局事务,我通过 MDB 从 jms 队列获取员工的数据,从 MDB 调用 insertEmployee() 方法并在 HibernateTemplate.flush() 方法上调用 TransactionrequiredException。不确定这里缺少什么,代码如下。
JTA 事务管理器
@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)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。