Estou mexendo com umas classes de persistencia por aqui e acabei de ter uma dúvida:
Vamos supor que eu tenha uma classe pessoa e uma classe pessoaFisica, qual das opções abaixo é melhor (desempenho e facilidade)?
1- Na classe PessoaFísica ter um atributo Pessoa
@Entity
public class Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
@Entity
public class PessoaFisica implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
private Pessoa pessoa;
}
2- A classe PessoaFísica herdar de Pessoa
@Entity
public class Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
@Entity
public class PessoaFisica extends Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
depende muito de como você ira utilizar isso no seu sistema
Caso seja herança o jeito certo de fazer com hibernate seria:
//Classe mae@Inheritance(InheritanceType.JOINED)//Caso vc queria que seja feita através da junção (através de uma foreign key) da(s) tabela(s) filha(s) com a tabela paiclassPessoa//Classe filha@PrimaryKeyJoinColumn(name=?pessoa_id?),//atributo relacionadoclassPessoaFisica
Este é so um exemplo, existe + 2 tipos de herança com hibernate!!!
Bom agora voltado a sua pergunta,caso no seu sistema você usa a herança para dar polimorfismo e reutilizacao de códgio eu aconselho a 2 opção, caso não utiliza a anotação manytoone.
Abraço
leandronsp
Primeiramente, pensando no modo em abstrair o negócio, acho que o correto é primeiro se perguntar: “Pessoa Física É uma Pessoa?” ou "Pessoa Física TEM uma Pessoa?"
Obviamente, Pessoa Física É uma pessoa. Desta forma, poderíamos achar que herança é a melhor forma.
Mas acho que depende da lógica com que vc vai trabalhar com esta classe. A herança irá trazer um alto grau de acoplamento entre as classes. Pra alguns casos, a herança pode ser a solução. Pra outros, pode ser o problema.
No sistema onde trabalho, utilizo bastante composição e interfaces. Em poucas situações utilizo herança (pq não vejo a composição como melhor forma neste caso).
eliangela
Obrigada pelas dicas!!
Agora eu gostaria de pedir a ajuda de vcs em mais uma coisinha: Onde eu posso encontrar um bom artigo, tutorial ou curso de hibernate avançado? Tudo o que eu encontro são coisas para iniciantes e eu estou tentando fazer um sistema complexo usando hibernate.
Obrigada
Tchello
Ou também em algum livro como o Hibernate In Action ou mesmo o EJB 3.0 da O’Reilly.
Abraços.
eliangela
Pessoal,
Consegui fazer o hibernate funcionar.. mas não do jeito que eu queria!!
Eu tentei colocar @Inheritance(strategy = InheritanceType.SINGLE_TABLE), JOINED e TABLE_PER_CLASS, e todas elas tiveram o mesmo resultado: Criaram somente a tabela Convenio no banco de dados com todos os campos de pessoa e pessoaJuridica.
Também não consegui fazer um @OneToMany Bidirecional com as classes Pessoa e Cidade... tive que comentar o atributo List<Pessoa> pessoas que está na classe Cidade.
Oque eu posso fazer pra resolver esses problemas??
Seguem minhas classes:
pessoa
Vc não precisava comentar o atributo List<Pessoa> na classe Cidade…vc pode colocar a anotação @ManyToOne que dá certo o bidirecionamento que vc quer.
[]
eliangela
leandronsp:
Vc não precisava comentar o atributo List<Pessoa> na classe Cidade…vc pode colocar a anotação @ManyToOne que dá certo o bidirecionamento que vc quer.
[]
Olá!
Na verdade eu já tinha colocado a anotação @ManyToOne, mas não tinha funcionado, por isso que eu apaguei a anotação e comentei o List<Pessoa>.
Agora estou no trabalho e meu projeto está em casa. À noite eu posto certinho o erro que dá quando eu coloco a anotação @ManyToOne junto com o List na superclasse.
Até
eliangela
Pessoal!!
Obrigada pelas dicas!!
Descobri qual era meu erro!!
Agora ficou assim:
ao invés de @MappedSuperClass, ficou @Entity
ao invés de @Inheritance(strategy=InheritanceType.SINGLE_TABLE), ficou @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
e eu descobri porque estava dando erros:
porque quando eu herdava de uma classe, eu estava colocando um campo id, como chave primária, e o certo é não ter essas chaves, porque a subclasse herda a chave da classe superior!!
classe pessoa
importjava.io.Serializable;importjava.util.Calendar;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.Inheritance;importjavax.persistence.InheritanceType;importjavax.persistence.JoinColumn;importjavax.persistence.ManyToOne;importjavax.persistence.Temporal;importjavax.persistence.TemporalType;/** * * @author eliangela */@Entity@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)publicabstractclassPessoaimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.AUTO)privateLongid;@ManyToOne(targetEntity=Cidade.class)@JoinColumn(nullable=true)privateCidadecidade;privateStringendereco;privateStringnumero;privateStringcomplemento;privateStringcep;privateStringbairro;privateStringtelefoneCelular;privateStringemail;@Temporal(TemporalType.DATE)privateCalendardataCadastro;privatecharsituacao;//gets e sets}
classe PessoaFisica
importjava.io.Serializable;importjava.util.Calendar;importjavax.persistence.Entity;importjavax.persistence.PrimaryKeyJoinColumn;importjavax.persistence.Temporal;importjavax.persistence.TemporalType;/** * * @author eliangela */@Entity@PrimaryKeyJoinColumn(name="id")publicabstractclassPessoaFisicaextendsPessoaimplementsSerializable{privatestaticfinallongserialVersionUID=1L;//SEM IDprivateStringnome;privateStringsexo;privateStringtelefoneResidencial;privateStringestadoCivil;@Temporal(TemporalType.DATE)privateCalendardataNascimento;privateStringcpf;privateStringrg;privateStringcaminhoFoto;//gets e sets}
Obrigada pessoal pelas dicas aqui e pelas dicas de livros!!