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