Usando @SecondaryTable Hibernate

Olá Pessoal,

O post de hoje vou mostrar como mapear duas tabelas em um bean do Hibernate. O motivo é que você não quer criar um bean para cada tabela, e precisa apenas ler algumas colunas de uma outra. E quer tudo no mesmo bean.

Lets go…

Contexto
Vamos supor que você tem o cenário a seguir :

E você precisa ler informações tanto da tabela infraestrutura e logicalserserver e ter tudo em um bean.

Desenvolvimento

Vou fazer um DAO bem simples somente para focarmos mais no proposito do post. Estou considerando que você já conhece o Hibernate e portanto toda aquela parte de config e  e .jars do framework não serão apresentados, caso tenha dúvida como fazer veja outros posts na categoria Hibernate do blog.

A seguir temos o nosso projeto:

 

DAO
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();
}
}

O bean
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;

MainDAO
Crie uma classe com o método main que vai ler os dados da tabela e imprimir. Nada de especial que 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. No próximo post veremos como fazer isso para mais de uma tabela a partir do mesmo bean.
Abracos, see ya!

Deixe um comentário

O seu endereço de e-mail não será publicado.