Versuchen Sie, Transaktionssteuerung und Logik in einer J2SE-Umgebung zu trennen J2EE-Anwendungsservercontainer und Spring-Funktionen werden überhaupt nicht verwendet
Die Ausführungsumgebung ist wie folgt
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();
}
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.
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.
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
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.
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