Mapeando Schemas diferentes Hibernate

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!!

2 comentários em “Mapeando Schemas diferentes Hibernate”

  1. Joao Guimaraes

    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.

    1. 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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *