'Why is Hibernate blocking Java process to exit?

And how do I avoid it?

This is the code I have:

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;
    }
}

and 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();
    }
}

So when I run the main method in TestClass, I will see a row inserted in the DB with "Sample Data" fine, but the program will never exit, it will just hang..

I think Hibernate is creating a thread, but how do I avoid it?



Solution 1:[1]

try to close entityManagerFactory also ,in your PersistenceUtil just make additional method to close 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()

    }
}

Solution 2:[2]

Can you try adding a method on PersistenceUtil called close that closes the EntityManagerFactory and see if the main thread completes

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Glorfindel