Java JPA: contrôle et logique des transactions séparés dans l'environnement J2SE

Au début

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

supposition

L'environnement d'exécution est le suivant

Chose que tu veux faire

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();
	}

Problèmes avec cette implémentation

Le processus d'acquisition EM est redondant

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.

Je souhaite prendre le contrôle du début, de la fin et de la restauration des transactions

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.

Pour résoudre les problèmes de mise en œuvre ci-dessus

Utiliser l'intercepteur

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

Diverses images de montage

Diagramme de classe

image.png

Explication du diagramme de classes

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é.

Source après résolution du problème

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

Java JPA: contrôle et logique des transactions séparés dans l'environnement J2SE
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Construction de l'environnement JavaFX dans Java 13
☾ Instruction Java / Repeat et instruction de contrôle de répétition
Environnement Java Spring dans vs Code
Exemple d'encodage et de décodage en Java
Classe StringBuffer et StringBuilder en Java
Remarques sur le contrôle du signal en Java
Comprendre equals et hashCode en Java
JPA (API de persistance Java) dans Eclipse
Bonjour tout le monde en Java et Gradle
Dégradation des performances du conteneur Java dans l'environnement Menikoa
Différence entre final et immuable en Java
Construction de l'environnement Play Framework 2.6 (Java) avec Eclipse
Qu'est-ce que Java et l'environnement de développement (MAC)
Différence entre les listes d'arry et les listes liées en Java
Programmer les en-têtes et pieds de page PDF en Java
Apprenez les modèles Flyweight et ConcurrentHashMap en Java
La direction de Java dans "C ++ Design and Evolution"
Logique du numéro de page et code de référence (java)
De Java à C et de C à Java dans Android Studio
Lire et écrire des fichiers gzip en Java
Différence entre int et Integer en Java
Environnement de développement d'applications Java créé dans un environnement VM
Discrimination d'énum dans Java 7 et supérieur
Installez Docker et créez un environnement d'exécution Java
Construction d'un environnement Java minimal et Hello World
Exemple de code pour le contrôle de la base de données par transaction déclarative avec Spring Boot + Spring Data JPA