Pessoal,
Estou desenvolvendo um processo de sincronia, no qual efetuo a minha conexão no main, e depois chamo os objetos para efetuar as devidas tratativas, porém tenho sempre que setar o EntityManager conectado no meu main para o novo objeto.
Será que neste objeto migraManager tem alguma rotina que eu possa buscar esta referência sem ter que ficar sempre setando na hora de criar.
No meu principal onde tenho o método main, Main.java
package br.com.cmnp.migra;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import br.com.cmnp.migra.manager.MigracaoManager;
public class Main extends Thread{
private static EntityManager em1;
private static EntityManager em2;
private static EntityManager em3;
public Main() throws InterruptedException {
try{
@SuppressWarnings("unused")
MigracaoManager migracaoManager = new MigracaoManager().setEm1(em1)
.setEm2(em2)
.setEm3(em3)
.migraDados();
}
catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
int retorno = 0;
EntityManagerFactory factory1 = Persistence.createEntityManagerFactory("pu1");
em1 = factory1.createEntityManager();
EntityManagerFactory factory2 = Persistence.createEntityManagerFactory("pu2");
em2 = factory2.createEntityManager();
EntityManagerFactory factory3 = Persistence.createEntityManagerFactory("pu3");
em3 = factory3.createEntityManager();
while (retorno == 0) {
Thread tmain = new Main();
tmain.start();
Thread.sleep(10000);
}
}
}
E no meu MigracacaoManager.java:
package br.com.cmnp.migra.manager;
import static com.google.code.liquidform.LiquidForm.alias;
import static com.google.code.liquidform.LiquidForm.select;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import org.hsqldb.SessionManager;
import br.com.cmnp.migra.persistence.entity.Tabela1;
import br.com.cmnp.migra.persistence.entity.Tabela2;
import br.com.cmnp.migra.persistence.entity.Tabela3;
public class MigracaoManager {
private EntityManager em1;
private EntityManager em2;
private EntityManager em3;
public MigracaoManager setEm2(EntityManager em2) {
this.em2 = em2;
return this;
}
public MigracaoManager setEm1(EntityManager em1) {
this.em1 = em1;
return this;
}
public MigracaoManager setEm3(EntityManager em3) {
this.em3 = em3;
return this;
}
public MigracaoManager migraDados() {
System.out.println("Vai começar...");
validateEM(em1,"em1");
validateEM(em2,"em2");
validateEM(em3,"em3");
Tabela1 t = alias(Tabela1.class, "t");
String query = select(t).from(Tabela1.class).as(t).toString();
try{
List<Tabela1> resultList = em1.createQuery(query).getResultList();
for (Tabela1 t1 : resultList) {
System.out.println("Lendo..."+t1.getNome());
em1.getTransaction().begin();
t1.setStatus("Atualizando");
em1.getTransaction().commit();
em1.merge(t1);
switch (t1.getDestino()) {
case 2:
Tabela2 t2 = new Tabela2();
t2.setNome(t1.getNome());
em2.getTransaction().begin();
em2.persist(t2);
em2.getTransaction().commit();
t1.setStatus("Atualizado");
break;
case 4:
Copia4 c4 = new Copia4()
.setEm(em3)
.copia();
break;
default:
t1.setStatus("Destino invalido");
break;
}
em1.getTransaction().begin();
em1.merge(t1);
em1.getTransaction().commit();
System.out.println(t1.getNome()+ "..."+t1.getStatus());
}
}
catch(PersistenceException pe){
System.out.println("PException:"+pe.getMessage());
}
catch(Exception e){
System.out.println("Exception:"+e.getMessage());
}
return this;
}
private void validateEM(EntityManager em, String nameEM){
if (em == null){
throw new PersistenceException("EntityManager @"+nameEM+"="+em);
}
if (!em.isOpen()){
throw new PersistenceException("EntityManager @"+nameEM+".isOpen()="+em.isOpen());
}
}
}
Queria evitar também o caso do objeto c4, que também foi necessário setar o EntityManager, se nesta classe tivesse algo que buscasse o EntityManager criado no objeto main.
Não acho que seria interessante ficar conectando e desconectando em cada objeto, pois terei vários processos em que serão executados mais de mil registros da tabela1, assim seriam mil conexões e desconexões, por isso optei por conectar no inicio do programa, configurar meu pool (persistence.xml), e utilizar estas conexões.
Será que tem algo diferente sem ter que setar.
Valeu pela atenção.