java - 为什么 Hibernate 会阻止 Java 进程退出?

标签 java hibernate jpa

我该如何避免它?

这是我的代码:

持久性.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 中运行 main 方法时,我会看到数据库中插入了一行,其中包含“示例数据”,但程序永远不会退出,它只会挂起..

我认为 Hibernate 正在创建一个线程,但如何避免它?

最佳答案

也尝试关闭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()

    }
}

关于java - 为什么 Hibernate 会阻止 Java 进程退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39248360/

相关文章:

hibernate - 是否可以在纯 JPA 中进行类型转换(从 boolean 到 yes_no)?

java - Spring Boot 2.0.0 循环 bean 依赖 EntityManger 和 SessionFactory

jsf - SimpleCRUD 登录失败

java - 不可变值对象和 JPA

java - 如何在 android 中使用 webView 获取 oAuth2 token ?

java - 使用 HibernateTemplate 的问题 : java. lang.NoSuchMethodError : org. hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;

java - Hibernate (JPA) 多个@OneToMany 用于同一模型

java - 如何使用 java 代码创建简单的 Android TextView 并在其上显示文本?

java - 使用 java 获取用参数替换的 SQL 字符串

java - 使用内存中 h2 的空日期平台之间的 dbunit 行为不一致