【发布时间】: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-helpers、http://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