微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HibernateTemplate.flush() 方法上的 TransactionRequiredException

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?