DataARTIGO

Usando uma secondary table no Hibernate

Olá, pessoal! No artigo de hoje vou mostrar como mapear duas tabelas em um bean do Hibernate. Trago esse assunto porque, acredito eu, você não quer criar um bean para cada tabela, já que precisa apenas ler algumas colunas de uma e outra, mas quer tudo no mesmo bean.

Vamos supor que você tem o seguinte cenário:

Você precisa ler informações tanto da tabela infraestrutura, quanto da logicalserserver e ainda ter tudo em um só bean.

Vou fazer um DAO bem simples, apenas para focarmos mais no proposito do artigo. Estou considerando que você já conhece o Hibernate e, portanto, toda aquela parte de configuração e .jars do framework não serão apresentados. Caso tenha dúvida como fazer, veja outros artigos antigos a esse respeito. 

A seguir, temos o nosso projeto:

A seguir temos nosso DAO:

public class DAO {
private static final ThreadLocal threadLocal = new ThreadLocal();
private static final SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

public static Session getSession(){
Session session = (Session) threadLocal.get();
if (session==null) {
session = sessionFactory.openSession();
}
return session ;
}

public void begin(){
getSession().getTransaction().begin();
}

public void commit(){
getSession().getTransaction().commit();
}

public void rollback(){
getSession().getTransaction().rollback();
}

}

Agora temos o nosso bean, onde mapeamos com as duas tabelas:

@Entity
@Table(name="infraestrutura")
@SecondaryTable(name="logicalserver")
public class InfraServer {
@Id
@Column(name="infra_id")
private int infraId;
@Column(name="name_infra")
private String nameInfra;
@Column(name="nameServer",table="logicalserver")
private String nameServer;

public int getInfraId() {
return infraId;
}
public void setInfraId(int infraId) {
this.infraId = infraId;
}
public String getNameInfra() {
return nameInfra;
}
public void setNameInfra(String nameInfra) {
this.nameInfra = nameInfra;
}
public String getNameServer() {
return nameServer;
}
public void setNameServer(String nameServer) {
this.nameServer = nameServer;
}
}

@SecondaryTable: Essa é a anotação que possibilita mapearmos uma segunda tabela para o mesmo bean. Nada de especial nela, apenas informamos o nome da tabela que desejamos:

@SecondaryTable(name="logicalserver")

Agora precisamos informar qual coluna pertence a segunda tabela. Quando não informado, o Hibernate vai considerar sempre o mapeamento que temos para @Table.

@Column(name="nameServer",table="logicalserver")
private String nameServer;

Crie uma classe com o método main, que vai ler os dados da tabela e imprimi-los. Nada de especial; apenas um simples HQL:

public class MainDAO  extends DAO{
public static void main(String[] args) {
List<InfraServer> retrieve = retrieve();

for (InfraServer infraServer : retrieve) {
System.out.println(infraServer.getNameInfra());
System.out.println(infraServer.getNameServer());
} }

public static List<InfraServer> retrieve(){
Query query = getSession().createQuery("from InfraServer");
return query.list();
}

Ao rodar obtemos o seguinte resultado:

Respectivamente, temos a tabela logicalserver, infraestrutura e o console do Eclipse.

É isso ai, pessoal! Bem simples fazer um bean mapear duas tabelas, não? No próximo artigo veremos como fazer isso para mais de uma tabela a partir do mesmo bean.

é 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