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!!