将JTA与Hibernate本机API一起使用(不带JPA)

将JTA与Hibernate本机API一起使用(不带JPA),hibernate,jakarta-ee,ejb,jta,Hibernate,Jakarta Ee,Ejb,Jta,我试图使用JTA来管理EJB中的事务,但我想使用Hibernate本地API,而不是JPA(所以使用Hibernate会话等等) 问题是,当我调用带有@TransactionAttribute(TransactionAttributeType.REQUIRED)注释的EJB方法时,事务不会开始或提交,我只得到java.sql.SQLException:超过了锁等待超时;一段时间后,在插入(保存)时尝试重新启动事务。事务本身已创建,但未处于活动状态 这是我的hibernate.cfg.xml: &

我试图使用JTA来管理EJB中的事务,但我想使用Hibernate本地API,而不是JPA(所以使用Hibernate会话等等)

问题是,当我调用带有
@TransactionAttribute(TransactionAttributeType.REQUIRED)
注释的EJB方法时,事务不会开始或提交,我只得到
java.sql.SQLException:超过了锁等待超时;一段时间后,在插入(保存)时尝试重新启动事务。事务本身已创建,但未处于活动状态

这是我的hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="connection.datasource">jdbc/dataSource</property>
    <property name="hibernate.dialect">cz.app.custom.hibernate.MySQL5InnoDBDialect</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.current_session_context_class">jta</property>
    <property name="hibernate.transaction.jta.platform">org.hibernate.service.jta.platform.internal.SunOneJtaPlatform</property>
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property>
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>

    <!-- Mappings -->
    <mapping resource="model/Email.hbm.xml"/>
  </session-factory>
</hibernate-configuration>
问题出在哪里?我错过了什么?

如玻璃鱼4

冬眠4


Java EE 7

你的persistence.xml文件是什么?我在发布这个问题时没有persistence.xml,但无论如何,当我添加persistence.xml时,结果是一样的。后来,我忘记了JTA,开始使用自定义事务拦截器…persistence.xml的内容是什么?
@Stateless
@LocalBean
@TransactionManagement(TransactionManagementType.CONTAINER)
public class MailService {

    public void send(Email email) {
        ... // Do some mail sending
        persist(Email email);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    private void persist(Email email) {

        // Persist
        System.out.println("CURRENT TRX: " + HibernateUtil.getSessionFactory().getCurrentSession().getTransaction()); // This prints out non-null value, so there is some transaction
        DaoFactory.obtain(Email.class).insert(email);
    }
}