Java 冬眠5+;非JTA数据源:未存储的对象
我面临一个问题,不知道出了什么问题。该中心:Java 冬眠5+;非JTA数据源:未存储的对象,java,hibernate,jakarta-ee,persistence,datasource,Java,Hibernate,Jakarta Ee,Persistence,Datasource,我面临一个问题,不知道出了什么问题。该中心: 冬眠5 ApacheTomcat 9 JSF2 没有春天。这很重要,因为我看到这个问题与Spring的使用有关,但这不是我的情况 数据源在Tomcat上正确配置,Hibernate还为每个新实体创建表并正确更新schemma 问题是,当我试图持久化一个新实体时,什么也没有发生。然后我尝试包含“flush()”调用。。。但是我有一个错误,说我没有激活的事务: javax.persistence.TransactionRequiredExceptio
- 冬眠5
- ApacheTomcat 9
- JSF2
- 在方法上包含“@Transactional”注释李>
- 在类上包含“@Transactional”注释李>
- 使用“beginTransaction()”调用强制开始事务,但我得到了一个空指针李>
Hibernate持久化单元
org.hibernate.jpa.HibernatePersistenceProvider
java:comp/env/jdbc/hospitalDatasource
我的实体:
在我的托管bean上,我有:
和:
它似乎工作正常,但问题发生在这里:
这样,就不会发生任何事情,也不会有例外。什么也没发生:
这样,我就有了“javax.persistence.TransactionRequiredException:没有正在进行的事务”:
我做错了什么?提前谢谢大家 您需要进一步配置
persistence.xml
或hibernate.cfg.xml
。您可以参考下面的链接来配置这些xml文件
这一条清楚地解释了问题所在: “javax.persistence.TransactionRequiredException:没有正在进行的事务” 首先,您清楚地提到您正在使用非JTA数据源。这意味着容器将不再为您管理事务边界。您必须自己开始并提交/回滚事务。因此,您需要遵循以下要求:
EntityManager em = ....
EntityTransaction et = em.getTransaction();
try {
et.begin();
em.persist(entity);
et.commit();
} catch (Exception ex) {
et.rollback();
throw new RuntimeException(ex);
}
好的,谢谢您的回复@Mayank。但这对我不起作用。我遵循了这个建议,得到了同样的错误:第二个和第三个链接不适用于我的案例,因为它指的是使用Spring或JPA/Hibernate的旧版本。无论如何谢谢你!
@PersistenceUnit
private EntityManagerFactory emf;
protected synchronized EntityManager getEntityManager() {
if (emf == null) {
emf = Persistence.createEntityManagerFactory("hospitalPU");
}
return emf.createEntityManager();
}
getEntityManager().persist(getDominio());
getEntityManager().persist(getDominio());
getEntityManager().flush(); //exception occours here!
EntityManager em = ....
EntityTransaction et = em.getTransaction();
try {
et.begin();
em.persist(entity);
et.commit();
} catch (Exception ex) {
et.rollback();
throw new RuntimeException(ex);
}