Hibernate: Mapear uma tabela sem uma entidade java (@Entity)

0 respostas
C

Blz galera,

Gostaria de compartilhar uma solução, não sei se é a melhor maneira de se fazer isso, mas deu certo no meu cenário.

Estou desenvolvendo um projeto JSF 2.0, PrimeFaces, Hibernate, etc… O hibernate está gerenciando 2 conexões a diferentes bancos, ou seja meu projeto possui 2 hibernate.cfg.xml (com diferentes nomes claro). Me deparei com uma necessidade a qual precisava de informações de uma tabela existente em um dos banco para o outra tabela do outro banco banco, porém não necessito de persistir um dos bancos, será utilizado apenas como fonte de consultas.

Para melhor entendimento podemos nomear:
Banco A (EXTERNO)
Banco B (INTERNO)

As informações que necessito sairá de uma tabela do BANCO A (Externo) para serem persistidas em uma tabela do BANCO B (interno) e pelo motivo de estarem em bancos separados, Session separadas não encontrei meio de relacioná-las, e para não replicar as informações, decidi enviar apenas os códigos para minha tabela do BANCO B.
E como podem ver na imagem acima a tabela do BANCO B está relacionada um para muitos, uma regra terá muitos procedimentos.

Como fazer isso sem criar uma classe (VO, @Entity) para persistir a tabela regra_procedimento já que irei apenas adicionar códigos (Integer) na tabela?
Pois bem a saida foi assim:

Na entidade regra:

@Entity
@Table(name="regra")
public class Regra implements Serializable{

        private Integer cod_regra;
        private Set<Integer> cod_procedimento;


  	@ElementCollection(targetClass = java.lang.Integer.class) 
	@JoinTable(name="regra_procedimento", joinColumns=@JoinColumn(name="cod_regra"))
	@IndexColumn(name="cod_procedimento")
	@Column(name="cod_procedimento")
	public Set<Integer> getCod_procedimento() {
		return cod_procedimento;
	}
  //getters, setters ...


}

Com as annotations acima, é possível relacionar os códigos a uma tabela (@JoinTable) onde a tabela possuirá uma chave composta (cod_regra: tabela do banco interno, cod_procedimento: tabela do banco externo), fazendo o relacionamento um para muitos sem necessidade de criar uma classe mapeanda com @Entity para relacionar a outra tabela.

Uma desvantagem em utilizar essa abordagem é que não consigo realizar o Lazy da consulta, mas devido a quantidade de dados, para meu projeto isso não será preocupante.

Tentei ser o mais claro possível dando uma solução que funciou, talvez nao seja a melhor maneira de se desenvolver.

Dúvidas estou a disposição.

Abraço,
Edu

Criado 27 de junho de 2011
Respostas 0
Participantes 1