2016-08-31 28 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,看看主線程完成

相關問題