Herança vs. Composição no Hibernate

4 respostas
D

Boa tarde pessoal! :slight_smile:

Seguinte, utilizando herança, tenho as classes:

pai = Funcionario
filhas = Administrativo e Docente

Fiz o mapeamento objeto-relacional com o Hibernate e gerei as tabelas. Até aí, tudo ok!!

Porém, estava dando uma lida num artigo sobre a velha discussão de composição vs. herança:

http://javaboutique.internet.com/tutorials/Inherit_Compose/

Implementei estas mesmas classes utilizando o conceito de composição:

@Entity
public class Funcionario implements Serializable{
	
	@Id
	@GeneratedValue
	private Long idPessoa;
	private String nome;
	private String endereco;
	private String telefone;
	private double salario;
     
       //getters and setters
}
@Entity
public class Administrativo {

	@Id
	@GeneratedValue
	private Long idAdministrativo;
	
	private Funcionario funcionario;
	
	private double adicionalNoturno;

        //getters and setters
}
@Entity
public class Docente{

	@Id
	@GeneratedValue
	private Long idDocente;

	private Funcionario funcionario;

	private int horasAula;
	
        //getters and setters
}

:?: Dúvida: existe alguma notação específica do Hibernate para tratar de composição??

Ou neste caso teria que utilizar as notações @OneToMany, ou @ManyToOne? Acho que ficaria estranho se tiver que ser desta forma, pois acabaria gerando relacionamentos sem sentido, do tipo Funcionario tem Docente, algo assim… :roll:

O que acham?

4 Respostas

W

Você quer fazer a implementação dessa composição igual a implementar a herança no bd?

D

eu quero saber se há alguma forma, alguma notação que faça com que o Hibernate “entenda” que a associação é uma composição e que a mapeie gerando as tabelas correspondentes num banco de dados relacional.

Resumindo: como o Hibernate trata composição? :?:

F

entenda primeiro os conceitos básicos

em poucas palavras, agregação você tem parte/todo(caso estejam ambos separados, sobreviverão), já em composição você tem todo apenas(o dono é um cara invejoso e não divide ele com ninguém). :smiley:

quanto ao mapeamento, procure identificar o dono do relacionamento.

sim, mas não em uma anotação exclusiva tipo composition. as anotações definem as associações possíveis entre as entidades(de um/muitos muitos/um, uni e bi-direcional apenas), o fato de você definir uma composição irá estabelecer o controle da navegacional de suas classes bem como seu tempo de vida.

sim.

recomendo dar uma olhada para saber mais
http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#entity-mapping-association

D

faelcavalcanti

obrigado pelas informações!! principalmente pelo link que passou!

entendo os conceitos de agregação e composição. A questão que levantei neste tópico, foi a discussão de herança vs. composição. Semanticamente, um Docente é um Funcionário, logo a herança é válida, porém é errado afirmar que Funcionário é parte de Docente. Logo, semanticamente, estaria errado utilizar composição neste caso. Contudo, segundo o artigo que passei no link, esta seria a forma de implementar composição ao invés de herança neste caso.

de qualquer maneira, pelo visto o Hibernate não possui uma notação específica para composição (e parece que nem faria sentido ter…), sendo que o relacionamento pode ser identificado através das notações OneToMany, ManyToMany, etc…

tenho algumas dúvidas com relação ao mapeamento de relacionamentos para código, mas vou deixar para um próximo tópico!

Criado 24 de setembro de 2008
Ultima resposta 30 de set. de 2008
Respostas 4
Participantes 3