Ajuda - Annotations Hibernate @ManyToOne e Herança

6 respostas
H

Olá gujeiros,

minha duvida é a seguinte.

Tenho as classes

Pessoa
Cliente
Funcionario
Email

class Pessoa {
      protected Long id;
      protected String nome;
      protected Set<Email> emails;
}

class Cliente extends Pessoa {
      private String cpf;
      private String cnpj;
}

class Funcionario extends Pessoa {
      private String cpf;
}

class Email {
      private Long id;
      private Pessoa pessoa;
      private String email;
}

estou com duvida nesses mapeamentos.

Como mapear para que: Cliente tenha use a tabela “clientes” e Funcionario use a tabela “funcionarios” e como mapear para que cada um tenha seus emails.

Abraço.

obs: Não coloquei os annotations q eu fiz até agora no código pq aqui ta dando errado, então só dificultaria o entendimento de todos.

Agradeço novamente.

6 Respostas

H

ninguem?

Weslley

[color=darkblue]existe a annotation @Table(name=nomedaTable)

ex…

@Entity

@Table(name=clientes)

public class Cliente {

//conteúdo da classe
}

A questão de E-mail é de acordo com a instancia…

tipo… Cliente e Funcionario herdam de Pessoa

se vc declarar Cliente cliente = new Cliente(), vc cria implicitamente uma instancia de Pessoa
se Funcionario funcionario = new Funcionario(), é outra instancia diferente…

OBS: vc tem q usar a annotation @Entity para q o Hibernate reconheça q sua classe é uma entidade… se não não funciona…

Não sei se ajudei…[/color]

F

Também existe a necessidade de colocar os annotations nos atributos, caso os identificadores dos atributos sejam diferentes dos identificadores da coluna no banco de dados.

Por exemplo, se o atributo nome da classe Pessoa se referir à coluna NOME_PESSOA da respectiva tabela, deverá existir um annotation da seguinte forma:

@Column(name=“NOME_PESSOA”)
private String nome;

Espero ter contribuido!

Abraços!

Weslley

[color=darkblue]sem sombra de dúvidas…

e outra… quando vc declarou dentro da entity Email a referencia do objeto Pessoa… dá pra entender que existe a table pessoa em seu BD…
O que vc terá que criar e mostrar ao Hibernate q há 1 x N com a table E-mail[/color]

H

Bom, mapear a herança eu consegui.

ficou assim:

@MappedSuperclass
class Pessoa {
     @Id
     private Long id;
     protected String nome;
     // outros atributos
}

@Entity
@Table(name="clientes")
class Cliente {
     @Id
     @GeneratedValue
     private Long id;
     private String cpf;
     
     // Agora o problema está aqui
     @OneToMany(mappedBy="Cliente")
     private Set<Email> emails;
     // Outros campos;
}

@Entity 
class Email {
     @Id
     @GeneratedValue
     private Long id;
     private String email;
     // o problema mora aqui
     @ManyToOne
     @JoinColumn(name="pessoa_id") 
     private Pessoa pessoa; // imagino que deva ser pessoa, pq qualquer um que herde de pessoa, pode ter emails
     private String tipoPessoa; // define q tipo de entidade tem o email ( ex:  tipoPessoa=cliente, pessoa_id = 1, então o email é do cliente 1 )
}

a classe de funcionario ficou praticamente igual a do cliente, então resolvi nao colocar.

Agora o problema é como mapear “polimorficamente” esse email

Abraço.

Obrigado a todos que colaboraram.

Weslley

[color=darkblue]Faz o seguinte…

Volta a declaração anterior…

Em vez de vc declarar private Set emails na Subclasse (Cliente e Funcionário)
volta ela para a superclasse (Pessoa)…

Ae vai ficar correto…[/color]

Criado 13 de abril de 2009
Ultima resposta 15 de abr. de 2009
Respostas 6
Participantes 3