【发布时间】:2017-12-03 10:49:12
【问题描述】:
我遇到了一个问题,不知道出了什么问题。世纪末:
- 休眠 5
- Apache Tomcat 9
- JSF 2
没有春天。说出来很重要,因为我看到这个问题在使用 Spring 时发生了,但这不是我的情况。
数据源已在 Tomcat 上正确配置,Hibernate 还为每个新实体正确创建表和更新模式。
问题是当我尝试持久化一个新实体时,什么也没有发生。然后我尝试包含“flush()”调用...但是我收到一个错误,说我没有交易活动:
javax.persistence.TransactionRequiredException:没有正在进行的事务
好像是事务需求相关的问题,不过我也试过了:
- 在方法上包含“@Transactional”注释;
- 在类中包含“@Transactional”注解;
- 使用“beginTransaction()”调用强制开始事务,但我得到了一个 NullPointer;
所以...我不知道该怎么办。
跟着你会看到我的相关代码。你能帮我解决这个问题吗?
persistence.xml 文件:
<persistence-unit name="hospitalPU" transaction-type="RESOURCE_LOCAL">
<description>
Persistence unit for Hibernate
</description>
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<non-jta-data-source>java:comp/env/jdbc/hospitalDatasource</non-jta-data-source>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.default_catalog" value="hospital" />
<property name="hibernate.connection.datasource" value="java:comp/env/jdbc/hospitalDatasource"/>
<property name="hibernate.id.new_generator_mappings" value="false" />
</properties>
</persistence-unit>
我的实体:
@Entity(name="Dominio")
@Table(name="Dominio")
public class Dominio implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Integer id;
here goes another fileds and getters/setters...
在我的托管 bean 上,我有:
@PersistenceUnit
private EntityManagerFactory emf;
还有:
protected synchronized EntityManager getEntityManager() {
if (emf == null) {
emf = Persistence.createEntityManagerFactory("hospitalPU");
}
return emf.createEntityManager();
}
它似乎工作正常,但问题发生在这里:
这样,什么都不会发生,也不会发生异常。什么都没有发生:
getEntityManager().persist(getDominio());
有了这个,我有“javax.persistence.TransactionRequiredException: no transaction is in progress”:
getEntityManager().persist(getDominio());
getEntityManager().flush(); //exception occours here!
我做错了什么?提前谢谢大家!
【问题讨论】:
标签: java hibernate jakarta-ee persistence datasource