【问题标题】:Hibernate 5 + Non JTA datasource: object not being storedHibernate 5 + 非 JTA 数据源:未存储对象
【发布时间】: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


    【解决方案1】:

    【讨论】:

    • 好的,谢谢@Mayank 的回复。但对我不起作用。我遵循了这个建议并得到了同样的错误:gist.github.com/imanoleizaguirre/3819393 第二个和第三个链接不适用于我的案例,因为它指的是使用 Spring 或旧版本的 JPA / Hibernate。还是谢谢!
    【解决方案2】:

    这里清楚地解释了问题所在: “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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-14
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多