All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.tsl2.nano.persistence.replication.hibernate.EntityReplication Maven / Gradle / Ivy

package de.tsl2.nano.persistence.replication.hibernate;

import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;

import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.xml.bind.JAXB;

import org.hibernate.ReplicationMode;
import org.hibernate.Session;

/** 
 * Replicates entities through hibernatesession.replicate(). EntityManagers will be load through their persistence unit names. 
 * To use it, 
 *   - create a META-INF/persistence.xml in your classpath
 *   - describe the two persistence-units (source and destination)
 *   - call: new EntityManager(mySourceUnit, myDestUnit).replicate(myBeans)
 *   
 * 
* @author Tom, Thomas Schneider * @version $Revision$ */ public class EntityReplication { private EntityManager src; private EntityManager dest; public EntityReplication(String srcPersistenceUnit, String destPersistenceUnit) { src = Persistence.createEntityManagerFactory(srcPersistenceUnit).createEntityManager(); dest = Persistence.createEntityManagerFactory(destPersistenceUnit).createEntityManager(); } public EntityReplication(EntityManager src, EntityManager dest) { this.src = src; this.dest = dest; } public void replicateFromIDs(Class entityClass, Object...ids) { T[] entities = Arrays.stream(ids). map(id -> src.find(entityClass, id, readOnlyHints())). toArray(s -> (T[])java.lang.reflect.Array.newInstance(entityClass, s)); replicate((Consumer)null, (Consumer)EntityReplication::strategySerialize, entities); } public void replicate(Class entityClass, T...entities) { replicate((Consumer)null, (Consumer)EntityReplication::strategySerialize, entities); } public void replicate(Consumer transformer, Consumer strategy, T...entities) { Session hibernateSession = dest.unwrap(Session.class); Arrays.stream(entities).forEach(e -> { //entity must be detached from src session src.detach(e); if (transformer != null) transformer.accept(e); if (strategy != null) strategy.accept(e); }); dest.flush(); } public static void strategySerialize(Object entity) { JAXB.marshal(entity, new File(entity.getClass().getSimpleName() + ".xml")); } public static void strategyHibReplicate(Session hibernateSession, Object entity) { hibernateSession.replicate(entity, ReplicationMode.OVERWRITE); } public static T load(String fileName, Class entityClass) { return JAXB.unmarshal(new File(fileName), entityClass); } private Map readOnlyHints() { HashMap hints = new HashMap<>(); hints.put("org.hibernate.readOnly", true); return hints; } public static void main(String[] args) throws ClassNotFoundException { EntityReplication repl = new EntityReplication(args[0], args[1]); Class cls = Class.forName(args[2]); repl.replicateFromIDs(cls, args[3]); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy