[RESOLVIDO] herança com hibernate

Olá pessoal!!

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; }

Obrigada!

Bom eliangela,

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 pai
class Pessoa

//Classe filha

 @PrimaryKeyJoinColumn(name=?pessoa_id?), //atributo relacionado
class PessoaFisica

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

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).

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

Ou também em algum livro como o Hibernate In Action ou mesmo o EJB 3.0 da O’Reilly.

Abraços.

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

[code]import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
*

  • @author eliangela
    */
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @MappedSuperclass
    public abstract class Pessoa implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @ManyToOne
    private Cidade cidade;
    private String endereco;
    private String numero;
    private String complemento;
    private String cep;
    private String bairro;
    private String telefoneCelular;
    private String email;
    @Temporal(TemporalType.DATE)
    private Calendar dataCadastro;
    private char situacao;[/code]
    pessoaJuridica

[code]import java.io.Serializable;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrimaryKeyJoinColumn;

/**
*

  • @author eliangela
    */
    @PrimaryKeyJoinColumn(name = “id”)
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @MappedSuperclass
    public abstract class PessoaJuridica extends Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String razaoSocial;
    private String nomeFantasia;
    private String fax;
    private String cnpj;
    private String ie;
    private String site;[/code]
    Convenio

[code]import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;

/**
*

  • @author eliangela
    */
    @Entity
    @PrimaryKeyJoinColumn(name = “id”)
    public class Convenio extends PessoaJuridica implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @OneToMany(mappedBy = “convenio”)
    private List<ConvenioProcedimento> convenioProcedimentos;[/code]
    Cidade

[code]import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
*

  • @author eliangela
    */
    @Entity
    public class Cidade implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    // private List<Pessoa> pessoas;
    private String nome;
    private String uf;[/code]

Obrigada

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.
[]

[quote=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.
[][/quote]

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é

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

[code]import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
*

  • @author eliangela
    */
    @Entity
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public abstract class Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @ManyToOne(targetEntity = Cidade.class)
    @JoinColumn(nullable = true)
    private Cidade cidade;
    private String endereco;
    private String numero;
    private String complemento;
    private String cep;
    private String bairro;
    private String telefoneCelular;
    private String email;
    @Temporal(TemporalType.DATE)
    private Calendar dataCadastro;
    private char situacao;
    //gets e sets
    }[/code]
    classe PessoaFisica

[code]import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
*

  • @author eliangela
    */
    @Entity
    @PrimaryKeyJoinColumn(name = “id”)
    public abstract class PessoaFisica extends Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    //SEM ID
    private String nome;
    private String sexo;
    private String telefoneResidencial;
    private String estadoCivil;
    @Temporal(TemporalType.DATE)
    private Calendar dataNascimento;
    private String cpf;
    private String rg;
    private String caminhoFoto;
    //gets e sets
    }[/code]

Obrigada pessoal pelas dicas aqui e pelas dicas de livros!!