DataARTIGO

Mapeando schemas diferentes com o Hibernate

Olá, pessoal! No artigo de hoje, nós vamos ver como se lê uma tabela, que está em um schema diferente do default do seu projeto, usando o Hibernate. Este será um artigo curto e bem prático.

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, você  precisa ter o modelo da tabela e criar um bean no seu projeto Java, para, logo após, fazer os devidos mapeamento com base no modelo. Algo parecido com o código a seguir:

@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 está o truque: no atributo schema da anotação @Table, onde informo qual schema usar. Por padrão, costuma-se usar o que foi definido no arquivo hibernate.cfg.xml. Por falar nele, precisamos atualizá-lo com o novo bean:

<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 “usuário”, do schema ereaders, é o que está sendo lido. Para isso, temos o seguinte dado na tabela:

Aqui, nós temos os Bds:

DAO

Vou assumir que você já tem o seu DAO implementado e inicializando as sessões corretamente. Eu criei uma classe que vai usar o 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 usuário 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, você terá que criar uma session com o user que tem permissão.

Vou ficando por aqui e espero que tenham gostado do artigo. Muito simples não é?

é Bacharel em Sistemas de Informação e Especialista em Gestão e Estratégia de Negócios. Trabalha com TI desde 2003 e possui as certificações SCJP 5 e SCM. Trabalhou na IBM Brasil como Analista Programador Java, passou pelo laboratório da Enterprise Computing Lab (ECL) HP como Software Engineer, Ci&amp;T como Engenheiro de Software em projeto JEE. Tem experiência internacional em Índia, Dubai e Londres. Atualmente é cofundador da ITSLabs (www.itslabs.com.br), uma start-up focada na criação de produtos web e mobile para start-ups. Também é autor dos livros "Guia do Exame SCJP", "Guia Prático JEE com Frameworks" e "TDD na prática".

Ver perfil