Duvida com herança, relacionamentos e EL

4 respostas
J

Pessoal,

Estou com um problema aqui, vou tentar ser claro, espero contar com a ajuda de voces.

Tenho uma classe PessoaFisica e outra Usuario, a minha classe Usuario herda de PessoaFisica. No BD utilizo a estrutura de subtableas, com isso, tenho uma tabela pessoa_fisica e outra tabela usuario. Consigo persistir os dados de um usuario no BD sem problemas (uso hibernate), cada uma das tabelas ficam com seu id e na tabela usuario tenho uma coluna que faz referencia a tabela pessoa_fisica. Até aí tudo bem.
O problema começa quando vou salvar um Pedido, a minha classe Pedido tem relacionamento com outras classes e com a classe Usuario (que herda de PessoaFisica), ao salvar um pedido no BD o id que é salvo é o id da minha tabela pessoa_fisica e não o id da tabela usuario, acho que isso nem é tão errado e/ou problematico, o problema é que ao tentar acessar via EL os atributos do meu objeto Usuario ou PessoaFisica, não acontece nada, simplesmente não mostra na tela nada.
Como a classe pedido tem relacionamento com usuario(nao sei se coloco esse relacionamento com PessoFisica), eu chamo, atraves de EL: ${pedido.usuario.nome}, ja tentei colocar ${pedido.pessoaFisica.nome} e não aparece nada, alguem pode me ajudar?
Espero ter conseguido fazer alguem enteder:

PessoaFisica.java:
package camisas.modelo;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import javax.persistence.TemporalType;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name = "pessoa_fisica", schema = "camisas")
@Inheritance(strategy=InheritanceType.JOINED)
public class PessoaFisica implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "nome")
    private String nome;
    
    @Column(name = "cpf")
    private String cpf;

    @Column(name = "sexo")
    private String sexo;
    
    @Temporal(TemporalType.DATE)
    @Column(name="data_nascimento")
    private Date dataNascimento;    

    @Column(name = "tel_residencial")
    private String telResidencial;

    @Column(name = "tel_comercial")
    private String telComercial;
    
    @Column(name = "celular")
    private String celular;

    @Column(name = "email")
    private String email;

    @OneToOne
    @JoinColumn(name = "endereco", referencedColumnName = "id", insertable = true, updatable = true)
    @Cascade(CascadeType.ALL)
    private Endereco endereco;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCelular() {
        return celular;
    }

    public void setCelular(String celular) {
        this.celular = celular;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public Date getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(Date dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    public String getTelComercial() {
        return telComercial;
    }

    public void setTelComercial(String telComercial) {
        this.telComercial = telComercial;
    }

    public String getTelResidencial() {
        return telResidencial;
    }

    public void setTelResidencial(String telResidencial) {
        this.telResidencial = telResidencial;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

}
Usuario.java:
package camisas.modelo;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name = "usuario", schema = "camisas")
@PrimaryKeyJoinColumn(name = "pessoa_fisica")
public class Usuario extends PessoaFisica implements Serializable {

    @Column(name = "login")
    private String login;

    @Column(name = "senha")
    private String senha;

    /*@Column(name = "tipo")
    private String tipo;*/

    @Column(name = "ativo")
    private String ativo;

    @OneToOne(mappedBy = "usuario")
    private Pedido pedido;

    public Usuario() {
        
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getAtivo() {
        return ativo;
    }

    public void setAtivo(String ativo) {
        this.ativo = ativo;
    }

    public Pedido getPedido() {
        return pedido;
    }

    public void setPedido(Pedido pedido) {
        this.pedido = pedido;
    }

}
Pedido.java
package camisas.modelo;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import javax.persistence.TemporalType;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name = "pedido", schema = "camisas")
public class Pedido implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @OneToOne
    @JoinColumn(name = "camisa", referencedColumnName = "id", insertable = true, updatable = true)
    @Cascade(CascadeType.ALL)
    private Camisa camisa;

    @OneToOne
    @JoinColumn(name = "usuario", referencedColumnName = "id", insertable = true, updatable = true)
    @Cascade(CascadeType.ALL)
    private Usuario usuario;

    @Temporal(TemporalType.DATE)
    @Column(name = "data_pedido")
    private Date data;

    @Column(name = "valor_total")
    private int valorTotal;

    public Pedido() {
        
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Camisa getCamisa() {
        return camisa;
    }

    public void setCamisa(Camisa camisa) {
        this.camisa = camisa;
    }

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public int getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(int valorTotal) {
        this.valorTotal = valorTotal;
    }

}

4 Respostas

J

Pessoal, apaguei todos os dados do meu Bd, pois achei que o problema poderia ser o id da tabela pesso_fisica esta diferente da tabela usuario, depois disso salvei um unico usuario e fiz um unico pedido, tudo certo, inclusive os ids, na hora que fui rodar a aplicação, encontreu o seguinte erro

javax.servlet.ServletException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of camisas.modelo.PessoaFisica.id

Alguem sabe porque isso?

Romildo_Paiter

De alguma maneira a um erro talvez em sua persistencia.

Pois esta dizendo que não pode pegar o valor do ID, na tabela Pessoa Fisica;

Troca o Identity, por AUTO. e Pede para o Hibernate recriar as tabelas.

J

Eu persisto os dados do usuario sem problemas (pessoa_fisica e usuario), troquei todos os ids de minhas entidades apra AUTO e nada tambem. Ate ontem a noite estava tudo funcionando, depois que limpei meu BD e zerei o auto_increment, ficando o mesmo id na tabela usuario e na tabela pessoa_fisica, aconteceu isso.
Muito estranho

J

Alguem pode me ajudar?

Criado 19 de maio de 2010
Ultima resposta 20 de mai. de 2010
Respostas 4
Participantes 2