Hibernate + PostgreSQL - 连接状态"Idle in transaction"

Mat*_*ari 6 postgresql hibernate jpa

我有一个使用Hibernate在Tomcat上运行的JSF应用程序.我做了一个小测试,暴露了te问题 - 创建了一个servlet,它唯一做的就是:

EntityManager em=null;
try {
    em = ConnectDb.getEntityManager();
    em.createQuery("from Frete").getResultList();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try{em.close();}catch(Exception ex){}
}
Run Code Online (Sandbox Code Playgroud)

如果我在pg_admin中执行以下sql,我得到一条记录,在"查询"列中我看到由hibernate执行的sql,在"state"列中它显示"在事务中空闲".

但问题是没有启动任何事务,我唯一做的就是创建一个查询.并且EntityManager已关闭 - 关闭它时没有抛出异常.

也许这是persistence.xml的配置,但我不知道.这是我的persistence.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="GestaoPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
      <property name="hibernate.connection.autocommit" value="false"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/AtualyGestao"/>
      <property name="javax.persistence.jdbc.password" value="atg4747"/>
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
      <property name="javax.persistence.jdbc.user" value="AtualyGestao"/>
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
      <property name="hibernate.format_sql" value="false"/>
      <property name="hibernate.connection.encoding" value="ISO-8859-1"/>
    </properties>
  </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

小智 1

我知道这是一篇非常古老的帖子。编写我的解决方案只是为了帮助当前面临此问题的其他人。我最近也面临这个问题。当我进行更多调试时,我发现即使在选择查询的情况下,休眠也会自动创建事务。并且它没有正确提交/回滚查询。因此,我明确添加了代码来启动和停止事务,这解决了问题。所以代码看起来像这样:

    SessionPersister session = CommonSessionPersisterFactory.INSTANCE.openSession(); 
    Transaction transaction = null;
    try {       
        transaction = session.beginTransaction();
        //do the query or update.

        transaction.commit();
    }
    catch(Exception re){
        transaction.rollback();
    }
    finally {
        if(session != null){
            Transaction tran = session.getTransaction();
            if(tran != null && tran.isActive() && !tran.wasCommitted() && tran.wasRolledBack()){
                tran.rollback();
            }
            session.close();
        }
Run Code Online (Sandbox Code Playgroud)