将JTA与Hibernate本机API一起使用(不带JPA)
我试图使用JTA来管理EJB中的事务,但我想使用Hibernate本地API,而不是JPA(所以使用Hibernate会话等等) 问题是,当我调用带有将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: &
@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);
}
}