Herança com Hibernate

2 respostas
M

Galera, estou com a seguinte duvida!

Tenho a situação abaixo:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name="tb_pessoa")
public abstract class Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    
    @Id
    @Column(name="id_pessoa")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String telefone;
    private String celular;
    private String email;
    @Embedded
    private Endereco endereco;
    private Boolean ativo;

    // getters e setters
}
@Entity
@PrimaryKeyJoinColumn(name="id_pessoa_fisica", referencedColumnName="id_pessoa")
@Table(name="tb_pessoa_fisica")
public class PessoaFisica extends Pessoa implements Serializable {
    
    private static final long serialVersionUID = 1L;

    private String nome;
    private String sobrenome;
    @Temporal(TemporalType.DATE)
    private Date nascimento;
    private String cpf;
    private String rg;
    @Enumerated(EnumType.STRING)
    private Sexo sexo;

    // getters e setters
}
@Entity
@PrimaryKeyJoinColumn(name="id_pessoa_juridica", referencedColumnName="id_pessoa")
@Table(name="tb_pessoa_juridica")
public class PessoaJuridica extends Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name="razao_social")
    private String razaoSocial;
    @Column(name="nome_fantasia")
    private String nomeFantasia;
    private String cnpj;
    private String contato;
    @Column(name="ramo_de_atividade")
    private String ramoDeAtividade;
    @Enumerated
    private Definicao definicao;

    // getters e setters
}

Até aí beleza, agora tenho uma entidade Venda que pode ser feita tanto para uma PF como para uma PJ, então:
1)- Como devo persistir isso em minha entidade Venda?
2)- Preciso criar uma entidade Funcionario, eu consigo extender diretamente de PessoaFisica? como notar isso?

Valeu!

2 Respostas

Kanin_Dragon

Jovem,

Como você mesmo disse o relacionamento com a tabela venda ocorrerá com PF e PJ, então é só inserir o relacionamento em Pessoa.

abs,

M

Então, a minha entidade Venda esta da seguinte maneira:

@Entity
@Table(name="tb_venda")
public class Venda implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="id_venda")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
    @JoinColumn(name="id_pessoa_venda", referencedColumnName="id_pessoa")
    private Pessoa pessoa;
    @Temporal(TemporalType.DATE)
    private Date dataVenda;

    // getter e setters
}

e estou tentando persistir da seguinte forma:

public class EfetuaVenda {

    public static void main(String[] args) {

        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();

        PessoaFisica pf = (PessoaFisica) session.get(PessoaFisica.class, 1L);

        Venda venda1 = new Venda();
        venda1.setDataVenda(new Date());
        venda1.setPessoa(pf);

        Venda venda2 = new Venda();
        venda2.setDataVenda(new Date());
        venda2.setPessoa(pf);

        try {
            session.getTransaction().begin();
            session.save(venda1);
            session.save(venda2);
            session.getTransaction().commit();
        } catch(Exception ex) {
            session.getTransaction().rollback();
            System.out.println(ex.getMessage());
        }

        session.close();
        factory.close();
}

Detalhe: na postagem da entidade PessoaFisica eu esqueci de colocar a alinha do relacionamento, abaixo esta corrigido:

@Entity  
@Inheritance(strategy = InheritanceType.JOINED)  
@Table(name="tb_pessoa")  
public abstract class Pessoa implements Serializable {  
  
    private static final long serialVersionUID = 1L;  
      
    @Id  
    @Column(name="id_pessoa")  
    @GeneratedValue(strategy = GenerationType.AUTO)  
    private Long id;  
    private String telefone;  
    private String celular;  
    private String email;  
    @Embedded  
    private Endereco endereco;
    @OneToMany(mappedBy = "pessoa", cascade={CascadeType.PERSIST, CascadeType.MERGE},fetch = FetchType.LAZY)
    private Collection<Venda> vendas;
    private Boolean ativo;  
  
    // getters e setters  
}

mas da o seguinte erro:

16/05/2011 17:07:34 org.hibernate.util.JDBCExceptionReporter logExceptions
AVISO: SQL Error: 1048, SQLState: 23000
16/05/2011 17:07:34 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: Coluna ‘id_pessoa_venda’ não pode ser vazia
could not insert: [entitys.Venda]

Criado 16 de maio de 2011
Ultima resposta 16 de mai. de 2011
Respostas 2
Participantes 2