Bei Verwendung von JPA (Hibernate) wird die Java-Anwendung auch dann nicht beendet, wenn sie die letzte Zeile der Hauptmethode erreicht.

Voraussetzung ist, dass die Version von Hibernate 5.3.3 ist. Die Abhängigkeiten von pom.xml sind wie folgt:

pom.xml


<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>5.3.3.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency>

Bereiten Sie zunächst die folgende "META-INF \ persistence.xml" vor. Der Dialekt und der Treiber sind Db2, aber hier spielt der RDBMS-Typ keine Rolle, und wenn Sie beispielsweise MySQL oder Postgres wählen, sollten Sie das gleiche Problem haben.

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="app">
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect" />
      <property name="hibernate.connection.driver_class" value="com.ibm.db2.jcc.DB2Driver" />
      <property name="hibernate.connection.url" value="jdbc:db2://[url]:[port]/[DBNAME]" />
      <property name="hibernate.connection.username" value="[user name]" />
      <property name="hibernate.connection.password" value="[password]" />
      <property name="hibernate.show_sql" value="true" />
    </properties>
  </persistence-unit>
</persistence>

__ Danach, als ich die folgende Hauptmethode erstellt und ausgeführt habe, wurde die Java-Anwendung nicht beendet (´ ・ ω ・ `) __ Wählen Sie beispielsweise in Eclipse "Rechtsklick> Ausführen als> Java-Anwendung" und wählen Sie Wenn Sie die Hauptmethode ausführen, wird die Meldung "beendet" angezeigt, nachdem der Inhalt der Reihe nach ausgeführt wurde. Wenn ich jedoch die Hauptmethode mit dieser Prozedur ausführe, scheint es, dass ich die letzte Zeile der Hauptmethode erreicht habe, aber die Meldung "beendet" wird nicht für immer angezeigt. Oder wenn Sie sie in einem ausführbaren JAR zusammenstellen und diese Hauptmethode ausführen, wird dieser Prozess niemals enden. Wenn Sie die Beendigung nicht mit "kill -9" usw. erzwingen, tritt das Phänomen auf, dass Sie die Hauptmethode nicht verlassen können.

Main.java


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class Main {
    public static void main(String[] args) {
        EntityManagerFactory factory = null;
        EntityManager manager = null;
        EntityTransaction transaction = null;
        
        try {
            factory = Persistence.createEntityManagerFactory("app");
            manager = factory.createEntityManager();
            transaction = manager.getTransaction();
            
            transaction.begin();            
            // DO SOMETHING:Führen Sie Operationen an der Datenbank aus.
            transaction.commit();
        } catch (RuntimeException e) {
            if (transaction != null && transaction.isActive()) {
                transaction.rollback();
            }
            throw e;
        }
    }
}

__ Übrigens wurde dieses Problem "Die Anwendung wird nicht beendet, obwohl ich die letzte Zeile der Hauptmethode erreicht habe" durch "close" "EntityManagerFactory" gelöst. __ Wenn Sie beispielsweise die Hauptmethode wie folgt umschreiben, zeigt Eclipse "beendet" an, wenn die Hauptmethode endet, und die ausführbare JAR-Datei schließt den Vorgang ab.

Main.java


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class Main {
    public static void main(String[] args) {
        EntityManagerFactory factory = null;
        EntityManager manager = null;
        EntityTransaction transaction = null;
        
        try {
            factory = Persistence.createEntityManagerFactory("app");
            manager = factory.createEntityManager();
            transaction = manager.getTransaction();
            
            transaction.begin();
            // DO SOMETHING:Führen Sie Operationen an der Datenbank aus.
            transaction.commit();
        } catch (RuntimeException e) {
            if (transaction != null && transaction.isActive()) {
                transaction.rollback();
            }
            throw e;
        } finally {
            if (manager != null) {
                manager.close();
            }
            if (factory != null) {
                factory.close();
            }
        }
    }
}

Kurz gesagt, es wurde durch das Auslassen des Schließens von "EntityManagerFactory" verursacht. In JavaDoc für EntityManagerFactory heißt es:" Wenn die Anwendung hat Nach Verwendung der Entity Manager-Factory und / oder beim Herunterfahren der Anwendung sollte die Anwendung die Entity Manager-Factory schließen. "Wenn Sie JavaEE oder Spring verwenden, verwenden Sie" @ Autowired "oder" @ Inject ", um eine Instanz zu erstellen. Grundsätzlich bleibt es dem Framework überlassen, aber wenn Sie den Lebenszyklus der Instanz wie im obigen Beispiel selbst steuern, rufen Sie am Ende der Anwendung "EntityManagerFactory # close" auf und lassen Sie JPA die Anwendung abschließen. Es scheint notwendig zu sein, auch zu benachrichtigen (´ ・ ω ・ `)

Recommended Posts

Bei Verwendung von JPA (Hibernate) wird die Java-Anwendung auch dann nicht beendet, wenn sie die letzte Zeile der Hauptmethode erreicht.
[Java] Umgang mit der Situation, in der das Programm, das in den Output Stream of Process schreibt, nicht endet, selbst wenn waitFor
Einstellungsmethode, die die Größe nicht ändert, auch wenn das CSS geändert wird
Selbst wenn ich die Einstellung von STRICT_QUOTE_ESCAPING in CATALINA_OPTS in tomcat8.5 schreibe, wird sie nicht wiedergegeben.
Überprüfen Sie den Status der Java-Anwendung, ohne das Überwachungstool zu verwenden
[Firebase] Firebase Auth currentUser wird auch nach der Deinstallation der App nicht null