2
respostas

Parâmetros

Olá, no início do curso você mencionou a possibilidade do Producer do entitymanager receber um parâmetro para escolher o banco de dados no caso de usar mais que um e que com o desacoplamento seria mais fácil . Neste caso como seria o envio e recebimento dele. Obrigado Fabiano

2 respostas

Fala Antonio, beleza?

Acho que o parâmetro seria o @PersistenceUnit e deve ser anotado no entitymanager.

Segue exemplo básico de uma apostila da Caelum:

@PersistenceUnit(unitName = "app")
    private EntityManagerFactory appFactory;

Porém vi que existem alguns detalhes a serem configurados como a necessidade de criar anotações para cada persistence-unit para o CDI saber qual o producer correto. Vou deixar o link ao final da apostila da Caelum.

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Qualifier
public @interface Corporativo {
}

Ali em cima, estamos declarando a anotação Corporativo como qualifier.

Agora, podemos utilizá-la:


    @RequestScoped
    @Produces
    @Corporativo
    public EntityManager createCorporativoEntityManager() {
        return corporativoFactory.createEntityManager();
    }

Enfim, vale a pena dar uma olhada :)

Segue o link: http://blog.caelum.com.br/acessando-multiplos-bancos-de-dados-com-jpa-e-cdi/

Olá Henrique,

fiz alguns testes com o exemplo acima e funcionou mas me deparei com uma situação que preciso acessar bancos de dados iguais localizados em schemas diferentes durante a transação. Não consegui uma forma de inserir no createEntityManagerSelect(String db) o parametro db. Não sei se seria a melhor forma mas é o que estou batalhando.

@ApplicationScoped
public class EntityManagerProducer implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @PersistenceUnit(unitName="cfg")
    private EntityManagerFactory factory_cfg;
    private EntityManager cfg;
    private HashMap<Long, EntityManagerFactory> listaEntity;

    public EntityManagerProducer() {
        factory_cfg = Persistence.createEntityManagerFactory("kpiDB_Cfg");
        cfg = factory_cfg.createEntityManager();
        listaEntity = new HashMap<Long, EntityManagerFactory>();

        Properties properites = new Properties();
        properites.setProperty("hibernate.default_schema", "kpi_53");
        listaEntity.put(Long.parseLong("1"), Persistence.createEntityManagerFactory("kpiDB", properites));
        properites.setProperty("hibernate.default_schema", "kpi_51");
        listaEntity.put(Long.parseLong("2"), Persistence.createEntityManagerFactory("kpiDB", properites));
        properites.setProperty("hibernate.default_schema", "kpi_53_mbo");
        listaEntity.put(Long.parseLong("3"), Persistence.createEntityManagerFactory("kpiDB", properites));
    }


    @Produces @RequestScoped @config
    public EntityManager createEntityManagerSelect() {
        return cfg;
    }

    @Produces @RequestScoped
    public EntityManager createEntityManagerSelect(String db) {
        //if para selecionar um entitytManager de listaEntity com base no db 
    }



    public void closeEntityManager(@Disposes EntityManager manager) {
      manager.close();
    }

}