Java JPA: Separate Transaktionssteuerung und Logik in der J2SE-Umgebung

Am Anfang

Versuchen Sie, Transaktionssteuerung und Logik in einer J2SE-Umgebung zu trennen J2EE-Anwendungsservercontainer und Spring-Funktionen werden überhaupt nicht verwendet

Annahme

Die Ausführungsumgebung ist wie folgt

Was du machen willst

Ich habe eine Logik erstellt, um "XML-Datei in postgresql zu registrieren" in Jouhousyori.java. Ich denke, das Lehrbuchbeispiel ist wie folgt

Jouhousyori.java


	public void execute() throws Exception{
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("myUnitInPersistenceXML");
		EntityManager em = factory.createEntityManager();		
		EntityTransaction entityTransaction = em.getTransaction();
		JouhousyoriEntity entity = new JouhousyoriEntity();
		String xml = new String(Files.readAllBytes(Paths.get(getPath())));
		entity .setText(xml);
		em.persist(entity);
		entityTransaction.commit();
	}

Probleme mit dieser Implementierung

EM-Erfassungsprozess ist redundant

Erstens ist der Prozess, eine EM zu bekommen, zu ärgerlich. Wenn es sich um ein Abschreibungsprogramm handelt, ist es zu mühsam, den EM-Erfassungsprozess jedes Mal zu schreiben, wenn die Anzahl der Klassen und Methoden, die die Datenbank verarbeiten, zunimmt.

Ich möchte die Kontrolle über den Start, das Ende und das Rollback von Transaktionen übernehmen

Wenn Sie als nächstes die Kontrolle über den Start, das Ende und das Rollback von Transaktionen in die Logikklasse einfügen, scheint die Lesbarkeit der Logikklasse erheblich eingeschränkt zu sein. Ich denke, die Leute haben hier unterschiedliche Geschmäcker, aber ich möchte Logik und Transaktionskontrolle trennen.

Um die oben genannten Implementierungsprobleme zu lösen

Verwenden Sie Interceptor

Wenn Sie mit allgemeiner Logik in Java umgehen möchten, können Sie eine Funktion namens Interceptor verwenden. Über Interceptor https://blogs.yahoo.co.jp/dk521123/33226901.html Es gibt ein konkretes Java-Implementierungsbeispiel in Auch für das Klassendiagramm und eine kurze Erläuterung der obigen Site https://afternoon-garden-70542.herokuapp.com/diarydetails/show/details/?id=76 Ich ziehe es an, also bitte auch

Verschiedene Montagebilder

Klassen Diagramm

image.png

Erklärung des Klassendiagramms

Die folgende Verarbeitung wird von TransactionInterceptor ausgeführt

Durch Schreiben der Verarbeitung von Transaktions- und EM-Operationen auf der TransactionInterceptor-Seite kann sich die Jouhousyori-Klasse auf die Verarbeitung konzentrieren, die sie ursprünglich ausführen möchte: "Lesen Sie die XML-Datei und führen Sie eine Persistenzverarbeitung auf dem em durch". Übrigens scheint so etwas wie DI realisiert worden zu sein.

Quelle nach Problemlösung

Jouhousyori.java


package logic;

import java.nio.file.Files;
import java.nio.file.Paths;

import javax.persistence.EntityManager;

import entity.JouhousyoriEntity;

public class Jouhousyori implements Logic{
	
	private EntityManager em;
	private String path;
	
	@Override
	public void execute() throws Exception{
		JouhousyoriEntity entity = new JouhousyoriEntity();
		String xml = new String(Files.readAllBytes(Paths.get(getPath())));
		entity .setText(xml);
		em.persist(entity);
	}
	public EntityManager getEm() {
		return em;
	}
	public void setEm(EntityManager em) {
		this.em = em;
	}
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
}

TransactionIntercepter.java


package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

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

public class TransactionIntercepter  implements InvocationHandler {
	   Object target;

	   private TransactionIntercepter(Object target) {
	      this.target = target;
	   }

	   @SuppressWarnings({ "rawtypes", "unchecked" })
	   public static <T> T getProxyInstance(T instance) {
		   Class<? extends Object> clazz = instance.getClass();
	      //Liste der von der Zielklasse implementierten Schnittstellen
		   Class[] classes = clazz.getInterfaces();
		   TransactionIntercepter intercepter = new TransactionIntercepter(instance);
		   T proxyInstance = (T) Proxy.newProxyInstance(clazz.getClassLoader(), classes, intercepter);
		   return proxyInstance;
	   }

	   @Override
	   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		   EntityManagerFactory factory = Persistence.createEntityManagerFactory("myUnitInPersistenceXML");
		   EntityManager em = factory.createEntityManager();		
		   EntityTransaction entityTransaction = em.getTransaction();
		   entityTransaction.begin();

		   Object result=null;
		   try {
			  //Legen Sie eine Instanz von Entity Manater fest
			  target.getClass().getDeclaredMethod("setEm",EntityManager.class).invoke(target,em);
		      //Rufen Sie den aktuellen Code auf
			  result = method.invoke(this.target, args);
		   }catch(Exception e) {
			   e.printStackTrace();
			  entityTransaction.rollback();;
			  throw e;
		   }
		   entityTransaction.commit();
		   return result;
	   }
}

LogicTest.java


import org.junit.jupiter.api.Test;

import logic.Jouhousyori;
import logic.Logic;
import proxy.TransactionIntercepter;

class LogicTest {

	@Test
	void testParsePDF() throws Exception{
		Jouhousyori target = new Jouhousyori();
		target.setPath("C:\\java\\workspace\\jyouhousyori2\\pdf\\xml\\2018h30h_sc_am2_qs.pdf.xml");
		Logic targetClass = TransactionIntercepter.getProxyInstance(target);
		targetClass.execute();
	}
}

Recommended Posts

Java JPA: Separate Transaktionssteuerung und Logik in der J2SE-Umgebung
Was ist in "Java 8 bis Java 11" passiert und wie wird eine Umgebung erstellt?
JavaFX-Umgebungskonstruktion in Java 13
☾ Java / Repeat-Anweisung und Repeat-Steueranweisung
Java Spring-Umgebung in vs Code
Beispiel für Codierung und Decodierung in Java
StringBuffer- und StringBuilder-Klasse in Java
Hinweise zur Signalsteuerung in Java
Verstehe gleich und hashCode in Java
JPA (Java Persistence API) in Eclipse
Hallo Welt in Java und Gradle
Leistungseinbußen bei Java-Containern in der Menicoa-Umgebung
Unterschied zwischen final und Immutable in Java
Spielen Sie die Framework 2.6 (Java) -Umgebungskonstruktion mit Eclipse
Was ist Java und Entwicklungsumgebung (MAC)
Unterschied zwischen Arrylist und verknüpfter Liste in Java
Programmieren Sie PDF-Kopf- und Fußzeilen in Java
Lernen Sie Flyweight-Muster und ConcurrentHashMap in Java
Die Richtung von Java in "C ++ Design and Evolution"
Seitenzahllogik und Referenzcode (Java)
Von Java nach C und von C nach Java in Android Studio
Lesen und Schreiben von GZIP-Dateien in Java
Unterschied zwischen int und Integer in Java
In einer VM-Umgebung erstellte Java-Anwendungsentwicklungsumgebung
Diskriminierung von Enum in Java 7 und höher
Installieren Sie Docker und erstellen Sie eine Java-Ausführungsumgebung
Minimale Java-Umgebungskonstruktion und Hello World
Beispielcode für die DB-Steuerung durch deklarative Transaktion mit Spring Boot + Spring Data JPA