Top Posts

MundoJ Ed. 49 – Artigo Criação de mocks com Mockito

Continue lendo

Mapeando Schemas diferentes Hibernate

Posted by camilolopes | Posted in Hibernate | Posted on 08-02-2012

2

olá Pessoal,

O post de hj veremos como ler uma tabela que está em um schema diferente do default do seu projeto usando o Hibernate. Será um post curto e bem prático.
Lets go…

Contexto

A situação aqui é muito simples. Precisamos ler uma tabela que está em outro schema do banco de dados via Hibernate. O que fazer?

Primeiro
Terá que ter o modelo da tabela e criar um bean no seu projeto Java e fazer os devidos mapeamento com base no modelo algo como:

@Entity
@Table(name=”Usuario”, schema=”ereaders”)
public class Usuarios {
@Id
@GeneratedValue
private int id;
@Column
private String nome;
@Column
private String email;
//getters/setters omitidos

Observe onde temos o pulo do gato, no atributo schema da anotação @Table onde informo qual schema usar. Por default é usado o que foi definido no arquivo hibernate.cfg.xml. Por falar nele precisamos atualizar com o novo bean ao <mapping/> :class=”br.com.camilolopes.bean.Usuarios”

note: assuma que seu hibernate.cfg.xml está apontando para um BD diferente. Alguma coisa como:
<property name=”hibernate.connection.url”>jdbc:mysql://localhost/auge</property>

Testando
Podemos checkar se de fato o conteúdo da tabela Usuario do schema ereaders, é o que está sendo lido, para isso, temos o seguinte dado na tabela Usuario:

 

Aqui nos temos os Bds:

DAO
Vou assumir que você já tem seu DAO implementado e inicializando as sessões corretamente, caso tenha dúvida verifique os posts sobre o assunto na categoria de Hibernate do blog. Criei uma classe que vai usar HQL para fazer um select na tabela e em seguida imprimir:

public class UsuariosDAO extends DAO {   
    public List getListUsuarios(){
        begin();
        Session session = getSession();
        String hql = “select us.email from Usuarios us”;
        Query query = session.createQuery(hql);
        List list = query.list();
            return list;
    }
}

Na classe main,vamos colocar isso só para ver o resultado:
public static void main(String[] args) {
        UsuariosDAO usuariosDAO = new UsuariosDAO();
                List<String> listUsuarios = usuariosDAO.getListUsuarios();
        for (String usuarios : listUsuarios) {
            System.out.println(usuarios);
        }
    }

Resultado

 

Enfim, temos dados de uma tabela em outro schema. A linha acima de camilo@ é que habilitei o sql_show no arquivo de configuração do hibernate.cfg.xml.

Problema
Como tudo não são flores, um problema aqui é que você não pode esquecer que o usuario informado no hibernate.cfg.xml deve ter permissão ao menos de leitura das tabelas no outro esquema. Do contrário verá exceções na tela com a mensagem permission denied. Se o usuário for diferente terá que criar uma session com o user que tem permissão.

Vou ficando por aqui, espero que tenham gostado do post. Muito simples não é?
Abraços, see ya!!

Related Posts with Thumbnails

Comments (2)

Boa tarde Camilo. Parabéns pelo post.
Hoje tenho em meu projeto 2 contextos, cada um apontando para Banco de Dados distintos, onde, um aponta para um banco de dados em MySql e outro para um banco de dados Sql Server, sendo assim, como eu poderia usar minhas classes com anotação @entity e @table apontando para seus respectivos Banco de dados vinculados aos seus respectivos @persistencecontext’s ????
– Será que você poderia me dar uma força com relação à isso ??? Já pesquisei bastante no google e não achei nenhum material que esclareça essa minha necessidade.

olá Joao,

Se tem dois contextos, vc pode fazer deploy em schema diferente usando o profile do maven e cada contexto vai subir com as config de banco de dados. Acredito que não é possivel acessar outro schema atraves das anotações, até por questoes de autenticação, privilegios que todo banco tem. E nao tem como vc especificar isso na anotação. Qdo vc está subindo a app isso é verificando já de imediato antes de subir, como faria isso em anotação? essa é a questão.

Write a comment