2016-08-31 32 views
0

我该如何避免它?为什么Hibernate阻止Java进程退出?

这是我的代码:

的persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
           http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
      version="2.1"> 
    <persistence-unit name="testdb" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <properties> 
      <property name="hibernate.connection.driver_class" value="org.h2.Driver"/> 
      <property name="hibernate.connection.url" value="jdbc:h2:tcp://localhost:9092/~/h2dbs/testdb"/> 
      <property name="hibernate.connection.username" value="sa"/> 
      <property name="hibernate.connection.password" value=""/> 
      <property name="hibernate.connection.useUnicode" value="true"/> 
      <property name="hibernate.connection.characterEncoding" value="utf-8"/> 
      <property name="hibernate.show_sql" value="false"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

PersistenceUtil.java

public class PersistenceUtil { 

    private static EntityManagerFactory entityManagerFactory; 

    static { 
     entityManagerFactory = Persistence.createEntityManagerFactory("testdb"); 
    } 

    public static EntityManager getEntityManager() { 
     final EntityManager entityManager = entityManagerFactory.createEntityManager(); 
     return entityManager; 
    } 
} 

和TestClass.java

public class TestClass { 
    public static void main(String[] args) { 
     final EntityManager em = PersistenceUtil.getEntityManager(); 
     final EntityTransaction transaction = em.getTransaction(); 
     transaction.begin(); 
     final TestTable testTable = new TestTable(); 
     testTable.setData("Sample Data"); 
     em.merge(testTable); 
     transaction.commit(); 
     em.close(); 
    } 
} 

所以,当我运行主要方法TestClass,我会看到一行插入数据库中的“Sample Data”很好,但程序永远不会退出,它只会挂起..

我觉得Hibernate正在创建一个线程,但我该如何避免它?

+0

使用'jstack'获取进程的线程转储并检查哪个线程正在运行? – Vasan

+0

你的意思是你不关闭你打开的EMF ... –

回答

2

尝试关闭的entityManagerFactory也,你PersistenceUtil只是让更多的方法来关闭的entityManagerFactory

public class PersistenceUtil { 

     private static EntityManagerFactory entityManagerFactory; 

     static { 
      entityManagerFactory = Persistence.createEntityManagerFactory("testdb"); 
     } 

     public static EntityManager getEntityManager() { 
      final EntityManager entityManager = entityManagerFactory.createEntityManager(); 
      return entityManager; 
     } 

    public static void closeEntityManagerFactory() { 
      entityManagerFactory.close(); 
     } 
    } 




public class TestClass { 
    public static void main(String[] args) { 
     final EntityManager em = PersistenceUtil.getEntityManager(); 
     final EntityTransaction transaction = em.getTransaction(); 
     transaction.begin(); 
     final TestTable testTable = new TestTable(); 
     testTable.setData("Sample Data"); 
     em.merge(testTable); 
     transaction.commit(); 
     em.close(): 
     PersistenceUtil.closeEntityManagerFactory() 

    } 
} 
+0

为什么你在工厂之后关闭EM? –

+0

@koray。对不起,这是错误的... –

1

你可以尝试添加一个方法上PersistenceUtil叫近,关闭EntityManagerFactory,看看主线程完成

相关问题