使用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>
但仍无效
答案 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" />