【问题标题】:Hibernate 4.3 transactions in CMT EJB with Glassfish v4带有 Glassfish v4 的 CMT EJB 中的 Hibernate 4.3 事务
【发布时间】:2014-03-13 21:35:09
【问题描述】:

我在 Glassfish 4 上使用 Java EE 7 和最新的 Hibernate 4.3。根据 Hibernate 文档(http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch01.html#tutorial-firstapp-helpershttp://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch13.html#transactions-demarcation-jta),我创建了:

pom.xml 依赖项

<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.4.Final</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.6</version>
    </dependency>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0</version>
    </dependency>
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>
</dependencies>

src/main/resources 中的hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
        <property name="hibernate.connection.username">xxx</property>
        <property name="hibernate.connection.password">xxx</property>
        <property name="hibernate.default_schema">xxx</property>

        <property name="hibernate.current_session_context_class">jta</property>
        <property name="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property>
        <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.SunONETransactionManagerLookup</property>

        <mapping class="xxx" />
    </session-factory>
</hibernate-configuration>

HibernateUtil 辅助类

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            Configuration configuration = new Configuration().configure();
            StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
            return configuration.buildSessionFactory(serviceRegistry);
        } catch (HibernateException ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

和 EJB 无状态 bean

@Stateless
public class AccountBean {
    SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

    @Transactional
    public List findAll() {
        Session session = sessionFactory.getCurrentSession();
        List accounts = session.createQuery("from Account").list();

        return accounts;
    }
}

但我遇到了异常:

org.hibernate.HibernateException: 没有 TransactionManagerLookup 指定于 org.hibernate.context.internal.JTASessionContext.currentSession(JTASessionContext.java:85) 在 org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)

唯一的工作方式是每次像这样手动启动事务:

public List findAll() {
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    List accounts = session.createQuery("from Account").list();
    session.getTransaction().commit();

    return accounts;
}

但根据文档,我不想一直写它,因为我不必这样做。

【问题讨论】:

  • 嗨!你是如何解决这个问题的?我也有同样的问题!谢谢。
  • 如果没有 HibernateUtil,您可以使用 Java EE 使用 @PersistenceContext 注解注入 EntityManager。在 EJB 中,所有方法默认都是事务性的。

标签: hibernate jakarta-ee glassfish jta


【解决方案1】:

不要使用

     <property name="hibernate.transaction.manager_lookup_class">...</property>

在 Hibernate 4 中。使用类似的东西

<property name="connection.datasource">jdbc/MyDB</property>
<property name="current_session_context_class">jta</property>
<property name="hibernate.transaction.factory_class">org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory</property>
<property name="hibernate.transaction.jta.platform">org.hibernate.service.jta.platform.internal.SunOneJtaPlatform</property>

【讨论】:

    【解决方案2】:

    不要忘记你的 EJB:

       @TransactionManagement(TransactionManagementType.CONTAINER)
       @TransactionAttribute(TransactionAttributeType.REQUIRED)
    

    【讨论】:

    • 不是答案,没有解决“未指定 TransactionManagerLookup”
    猜你喜欢
    • 2015-11-26
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    相关资源
    最近更新 更多