为什么在Servlet中使用UserTransaction时Hibernate没有写入更改?

时间:2012-05-20 20:28:08

标签: hibernate servlets transactions ejb jta

使用Hibernate:

@PersistenceUnit(unitName = "oracle")
private EntityManagerFactory emf;
@Resource
private UserTransaction u;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
         EntityManager em = emf.createEntityManager();
try {
         u.begin();
         em.persist(some entity);
         u.commit();
     } catch (Exception e) {
         e.printStackTrace();
     }

这不会给数据库写任何东西,如果我切换到EclipseLink就可以了。
如果我使用

EntityTransaction et = em.getTransaction();

而不是UserTransaction hibernates写入数据库。 (所以hibernate不会像EclipseLink那样看到JTA。)



Hibernate有什么问题? (4.0.0决赛) 感谢

编辑:

我添加了最后两个属性:(我正在使用glassfish)

<properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/>
    <property name="hibernate.show_sql" value="true"/>
    <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory" />
    <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup" />
</properties>

但仍无效

3 个答案:

答案 0 :(得分:3)

我删除了最后两个属性,因为它们不是必需的 我的问题是我在u.begin()之外创建EM,我应该在事务中创建它或者调用em.joinTransaction()

感谢:

我从这里得到了答案: Hibernate JPA with JTA and Glassfish Application Server doesn't seem to commit

答案 1 :(得分:0)

确保Hibernate知道JTA事务管理器以将自己作为事务资源登记。

将* hibernate.transaction.factory_class *属性配置为 org.hibernate.transaction.JTATransactionFactory ,并将* hibernate.transaction.manager_lookup_class *属性配置为服务器的事务管理器查找类,例如: org.hibernate.transaction.JBossTransactionManagerLookup ,或通过继承 org.hibernate.transaction.JNDITransactionManagerLookup 来实现自己的。

示例 hibernate.properties

hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_lookup_class = org.hibernate.transaction.JBossTransactionManagerLookup

有关详细信息,请参阅Hibernate Reference Documentation, Section 3.3. JDBC connections

答案 2 :(得分:0)

对我而言,只有在我删除以下行后才开始正常工作:

<property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory" />