Essayez de séparer le contrôle des transactions et la logique dans un environnement J2SE Le conteneur de serveur d'applications J2EE et les fonctions Spring ne sont pas du tout utilisés
L'environnement d'exécution est le suivant
J'ai fait une logique pour "enregistrer le fichier xml dans postgresql" dans Jouhousyori.java. Je pense que l'exemple du manuel est le suivant
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();
}
Premièrement, le processus d'obtention d'un EM est trop ennuyeux. S'il s'agit d'un programme de dépréciation, il est trop difficile d'écrire le processus d'acquisition EM chaque fois que le nombre de classes et de méthodes qui traitent la base de données augmente.
Ensuite, si vous placez le contrôle du début, de la fin et de la restauration des transactions dans la classe logique, la lisibilité de la classe logique semble être considérablement réduite. Je pense que les gens ont des goûts différents ici, mais je veux séparer la logique et le contrôle des transactions.
Si vous souhaitez gérer la logique commune en Java, vous pouvez utiliser une fonction appelée Interceptor. À propos d'Interceptor https://blogs.yahoo.co.jp/dk521123/33226901.html Il existe un exemple concret d'implémentation Java dans Aussi, pour le diagramme de classe et une brève explication du site ci-dessus https://afternoon-garden-70542.herokuapp.com/diarydetails/show/details/?id=76 Je l'ai mis, alors s'il te plaît aussi
Le traitement suivant est effectué par TransactionInterceptor
En écrivant le traitement des opérations de transaction et EM côté TransactionInterceptor, la classe Jouhousyori peut se concentrer sur le traitement qu'elle souhaite à l'origine faire, "lire le fichier xml et effectuer un traitement de persistance sur l'em". Au fait, il semble que quelque chose comme DI ait été réalisé.
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 des interfaces implémentées par la classe cible
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 {
//Définir une instance de Entity Manater
target.getClass().getDeclaredMethod("setEm",EntityManager.class).invoke(target,em);
//Appelez le code réel
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