Lucas_Cavalcanti 27 de mai. de 2013
e qual seria o uso disso?
cpmmarcelo 29 de mai. de 2013
Oi Lucas eu iria controlar o aplicativo por empresa (configuracao personalizada por empresa ), entao eu queria saber para qual empresa o sistema iria trabalhar.
resolvi isso dessa forma
@Pach ( "/" )
public void index () { // padrao no sistemas para usar em demonstracoes etc
sessao . setEmpresa ( Empresa . DEFAULT );
}
@Patch ( "/{empresa}"
public void index ( String empresa ) {
if ( empresa . equals ( "1" ) { sessao . setEmpresa ( Empresa . EMPRESA1 ); }
if ( empresa . equals ( "2" ) { sessao . setEmpresa ( Empresa . EMPRESA2 ); }
{
E no meu JPAFactory fiz assin
public class JPAFactory {
private static EntityManagerFactory factory ;
private static EntityManagerFactory empresa1 ;
private static EntityManagerFactory empresa2 ;
public static EntityManager getEntityManager ( UserSession sessao ){
Map meuconfig = new HashMap ();
if ( sessao . getEmpresa () == Empresa . DEFAULT && factory == null ){
meuconfig . put ( "hibernate.connection.url" , "jdbc:postgresql://localhost:5432/demonstra" );
factory = Persistence . createEntityManagerFactory ( "sistemaPU" , meuconfig );
sessao . setMyfactory ( factory );
}
if ( sessao . getEmpresa () == Empresa . EMPRESA1 && empresa1 == null ){
meuconfig . put ( "hibernate.connection.url" , "jdbc:postgresql://localhost:5432/empresa1" );
empresa1 = Persistence . createEntityManagerFactory ( "sistemaPU" , meuconfig );
sessao . setMyfactory ( empresa1 );
}
if ( sessao . getEmpresa () == Empresa . EMPRESA2 && empresa2 == null ){
meuconfig . put ( "hibernate.connection.url" , "jdbc:postgresql://localhost:5432/empresa2" );
empresa2 = Persistence . createEntityManagerFactory ( "sistemaPU" , meuconfig );
sessao . setMyfactory ( empresa2 );
}
if ( sessao . getEmpresa () == Empresa . DEFAULT ){
return factory . createEntityManager ();
} else if ( sessao . getEmpresa () == Empresa . EMPRESA1 ){
return empresa1 . createEntityManager ();
} else if ( sessao . getEmpresa () == Empresa . EMPRESA2 ){
return empresa2 . createEntityManager ();
} else {
return sessao . getMyfactory (). createEntityManager ();
}
}
}
Meu dao ficou assim
@Component
public class ProdutoDAO {
private EntityManager manager ;
public ProdutoDAO ( UserSession sessao ) {
manager = JPAFactory . getEntityManager ( sessao );
}
}
Meu Controller
@Resource
public class ProdutoController {
private Result result ;
private Validator validator ;
private ProodutoDAO produtodao ;
public ProdutoController ( Result result , Validator validator , ProdutoDAO produtodao ) {
this . result = result ;
this . validator = validator ;
this . produtodao = produtodao ;
}
}
Foi a unica maneira que conseguir.
Não achei maneira melhor de fazer isso!!!
Lucas_Cavalcanti 29 de mai. de 2013
só cuidado que vc não está fechando o EntityManager… isso pode segurar todas as conexões disponíveis com o banco de dados…
o ideal é vc criar uma factory:
@ Component
public class ManagerFactory implements ComponentFactory < EntityManager > {
// recebe no construtor o userSession
// salva a entityManager num atributo
// retorna o entityManager no getInstance ()
@ PreDestroy
public void fecha () {
manager . close ()
}
}
parecido com esse cara, só vai mudar o construtor:
https://github.com/caelum/vraptor-jpa/blob/master/src/main/java/br/com/caelum/vraptor/util/jpa/EntityManagerCreator.java
daí vc recebe apenas EntityManager no construtor dos daos.