Mapeamento Hibernate

Pessoal, estou quase ficando louco com isso aqui. O problema é o seguinte, Tenho 2 atributos em uma classe com o mapeamento quase idêntico. O problema é: um funciona e outro não. Tenho uma classe chamada Empresa e outra chamada Cliente. Na classe cliente tenho o atributo matriz. Na tabela tem a informação da matriz, mas o hibernate retorna null. Perceba que o atribulo localEntrega é quase a mesma coisa, e é do mesmo tipo, e funciona normalmente.

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.SecondaryTable;
import javax.persistence.SecondaryTables;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.validator.NotEmpty;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Valid;

import com.democrata.comercial.pedido.NegociacaoComercial;
import com.democrata.comercial.pedido.VariacaoTabelaCliente;


@Entity
@Table(name="EMPRESA")
@SecondaryTables({
    @SecondaryTable(name="PREFCLI"),
    @SecondaryTable(name="CLIENTE_NEGOCIACAO_COMERCIAL", 
                    pkJoinColumns={@PrimaryKeyJoinColumn(name="CLIENTE")}
                   ),    
    @SecondaryTable(name="COMPLEMPRESA", 
                    pkJoinColumns={@PrimaryKeyJoinColumn(name="EMPRESA")}
                   )
})
@DiscriminatorValue("2")
public class Cliente extends Empresa implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public Cliente(){
		super();		
		getTipoEmpresa().setTipo(2);
	}

	@Column(name = "CARTEIRA")
    private Character carteira;        
    
    @Column(name = "RATING_COMERCIAL")
    private String ratingComercial;
    
    @Column(name = "RATING_FINANCEIRO")
    private String ratingFinanceiro;
    
    @Column(name = "NUMERO_LOJAS")
    private Short numeroLojas;
    
    @Column(name = "EMAIL_FINANCEIRO")
    private String emailFinanceiro;    
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(table="PREFCLI", name="REPRESENTANTE")    
    private Representante representante;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(table="PREFCLI", name="LOCAL_ENTREGA")
    private Empresa localEntrega;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(table="PREFCLI", name="MATRIZ")
    private Empresa matriz;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(table="PREFCLI", name="LOCAL_COBRANCA")
    private Empresa localCobranca;
    
    @OneToMany(mappedBy="cliente", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private Collection<VariacaoTabelaCliente> variacaoTabelaCliente;
    
    @Embedded
    private NegociacaoComercial negociacaoComercial;
    
    @Embedded    
    private InformacaoBancaria informacaoBancaria;
    
    @Embedded
    private InformacaoCredito informacaoCredito;
    
    @Column(name="VALIDACAO_DOCUMENTACAO")
    @Temporal(TemporalType.TIMESTAMP)
    private Date validacaoDocumentacao;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="TRADER")
    private Trader trader;

	public final Trader getTrader() {
		return trader;
	}

	public final void setTrader(Trader trader) {
		this.trader = trader;
	}

	public void addVariacaoTabelaPreco(Filial unidadeProducao, char variacao){
    	VariacaoTabelaCliente vartab = new VariacaoTabelaCliente();
    	vartab.setCliente(this);
    	vartab.setUnidadeProducao(unidadeProducao);
    	vartab.setVariacaoTabelaPreco(variacao);
    	getVariacaoTabelaCliente().add(vartab);
    }
 
	public char getVariacaotabelaByFilial(Filial filial){        
        char tabela = 'A';        
        for (VariacaoTabelaCliente vtc: getVariacaoTabelaCliente()){            
            if (vtc.getUnidadeProducao().getCgcCpf().equals(filial.getCgcCpf())){
                tabela = vtc.getVariacaoTabelaPreco();
            }
        } 
        return tabela;
    }
	
    public Character getCarteira() {
        return carteira;
    }

    public void setCarteira(Character carteira) {
        this.carteira = carteira;
    }

    @NotEmpty
    public String getRatingComercial() {
    	if (ratingComercial.isEmpty()) setRatingComercial("B");
        return ratingComercial;
    }

    public void setRatingComercial(String ratingComercial) {
        this.ratingComercial = ratingComercial;
    }


    public String getRatingFinanceiro() {
    	if (ratingFinanceiro.isEmpty()) setRatingFinanceiro("B");
        return ratingFinanceiro;
    }

    public void setRatingFinanceiro(String ratingFinanceiro) {
        this.ratingFinanceiro = ratingFinanceiro;
    }


    public Short getNumeroLojas() {
        return numeroLojas;
    }

    public void setNumeroLojas(Short numeroLojas) {
        this.numeroLojas = numeroLojas;
    }


    public String getEmailFinanceiro() {
        return emailFinanceiro;
    }

    public void setEmailFinanceiro(String emailFinanceiro) {
        this.emailFinanceiro = emailFinanceiro;
    }

    @NotNull
    public Representante getRepresentante() {
    	return representante;
    }

    public void setRepresentante(Representante representante) {
        this.representante = representante;
    }
    
    public Empresa getLocalEntrega() {    	
    	return localEntrega;
    }

    public void setLocalEntrega(Empresa localEntrega) {
        this.localEntrega = localEntrega;
    }

    public Empresa getLocalCobranca() {    	
    	return localCobranca;
    }

    public void setLocalCobranca(Empresa localCobranca) {
        this.localCobranca = localCobranca;
    }

    public NegociacaoComercial getNegociacaoComercial() {
        return negociacaoComercial;
    }

    public void setNegociacaoComercial(NegociacaoComercial negociacaoComercial) {
        this.negociacaoComercial = negociacaoComercial;
    }

    @NotNull @Valid
    public InformacaoBancaria getInformacaoBancaria() {
        return informacaoBancaria;
    }

    public void setInformacaoBancaria(InformacaoBancaria informacaoBancaria) {
        this.informacaoBancaria = informacaoBancaria;
    }

    public Collection<VariacaoTabelaCliente> getVariacaoTabelaCliente() {
        return variacaoTabelaCliente;
    }

    public void setVariacaoTabelaCliente(Collection<VariacaoTabelaCliente> variacaoTabelaCliente) {
        this.variacaoTabelaCliente = variacaoTabelaCliente;
    }

    public InformacaoCredito getInformacaoCredito() {
        return informacaoCredito;
    }

    public void setInformacaoCredito(InformacaoCredito informacaoCredito) {
        this.informacaoCredito = informacaoCredito;
    }

    public Date getValidacaoDocumentacao() {
        return validacaoDocumentacao;
    }

    public void setValidacaoDocumentacao(Date validacaoDocumentacao) {
        this.validacaoDocumentacao = validacaoDocumentacao;
    }

	public final Empresa getMatriz() {
		return matriz;
	}

	public final void setMatriz(Empresa matriz) {
		this.matriz = matriz;
	}

}

agora a classe Empresa:

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SecondaryTable;
import javax.persistence.Table;

import org.hibernate.validator.Email;
import org.hibernate.validator.NotEmpty;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Pattern;
import org.hibernate.validator.Valid;

import com.democrata.cep.Endereco;

@Entity
@Table(name="EMPRESA")
@SecondaryTable(name="PREFCLI")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TIPO_EMPRESA",discriminatorType=DiscriminatorType.INTEGER)
public class Empresa implements Serializable{    

	private static final long serialVersionUID = 1L;
    
    @Id    
    @Column(name = "CGC_CPF")    
    private String cgcCpf;    
    
    @Column(name = "FIS_JUR")
    private String fisicaJuridica;
    
    @Column(name = "RAZAO")    
    private String razaoSocial;
    
    @Column(name = "INSC_ESTADUAL")    
    private String inscEstadual;
    
    @Column(name = "INSC_MUNICIPAL")    
    private String inscMunicipal;
    
    @Column(name = "RG")    
    private String rg;
    
    @Column(name = "FONE1")    
    private String fone1;
    
    @Column(name = "FONE2")    
    private String fone2;
    
    @Column(name = "FAX")
    private String fax;
    
    @Column(name = "E_MAIL")    
    private String eMail;
    
    @Column(name = "FANTASIA")    
    private String fantasia;
    
    @Column(name = "CONTATO")    
    private String contato;
    
    @Column(name = "SITUACAO")    
    private String situacao;
    
    @Column(name = "SUFRAMA")    
    private String suframa;
    
    @Embedded       
    private Endereco endereco;
        
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "TIPO_EMPRESA", referencedColumnName = "TIPO", insertable=false, updatable=false)
    @NotNull
    private TipoEmpresa tipoEmpresa; 

	public Empresa(){
    	setTipoEmpresa(new TipoEmpresa());
    	setEndereco(new Endereco());
    	setFisicaJuridica("J");
    }

    @CnpjCpf  
    public String getCgcCpf() {
        return cgcCpf;
    }

    public void setCgcCpf(String cgcCpf) {
      	this.cgcCpf = cgcCpf;
    }
    
    @NotNull @Pattern(regex="[F|J]",message="deve ser F ou J")
    public String getFisicaJuridica() {
        return fisicaJuridica;
    }

    public void setFisicaJuridica(String fisicaJuridica) {
        this.fisicaJuridica = fisicaJuridica;
    }

    @NotEmpty
    public String getRazaoSocial() {
        return razaoSocial;
    }

    public void setRazaoSocial(String razaoSocial) {
        this.razaoSocial = razaoSocial;
    }

    @NotEmpty
    public String getInscEstadual() {    	
    	if (getFisicaJuridica().equals("F")) inscEstadual = "ISENTO";
        return inscEstadual;
    }

    public void setInscEstadual(String inscEstadual) {    	
        this.inscEstadual = inscEstadual;
    }

    public String getInscMunicipal() {
        return inscMunicipal;
    }

    public void setInscMunicipal(String inscMunicipal) {
        this.inscMunicipal = inscMunicipal;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }

    @NotEmpty
    public String getFone1() {
        return fone1;
    }

    public void setFone1(String fone1) {
        this.fone1 = fone1;
    }

    public String getFone2() {
        return fone2;
    }

    public void setFone2(String fone2) {
        this.fone2 = fone2;
    }

    public String getFax() {
        return fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    @NotEmpty @Email
    public String getEMail() {
        return eMail;
    }

    public void setEMail(String eMail) {
        this.eMail = eMail;
    }

    @NotEmpty
    public String getFantasia() {
        return fantasia;
    }

    public void setFantasia(String fantasia) {
        this.fantasia = fantasia;
    }

    @NotEmpty
    public String getContato() {
        return contato;
    }

    public void setContato(String contato) {
        this.contato = contato;
    }

    public String getSituacao() {
        return situacao;
    }

    public void setSituacao(String situacao) {
        this.situacao = situacao;
    }

    public String getSuframa() {
        return suframa;
    }

    public void setSuframa(String suframa) {
        this.suframa = suframa;
    }

    @NotNull @Valid 
    public Endereco getEndereco() {
        return endereco;
    }

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

    public TipoEmpresa getTipoEmpresa() {
        return tipoEmpresa;
    }

    public void setTipoEmpresa(TipoEmpresa tipoEmpresa) {
        this.tipoEmpresa = tipoEmpresa;
    }

	@Override
    public int hashCode() {
        int hash = 0;
        hash += (getCgcCpf() != null ? getCgcCpf().hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Empresa)) {
            return false;
        }
        Empresa other = (Empresa) object;
        if ((this.getCgcCpf() == null && other.getCgcCpf() != null) || (this.getCgcCpf() != null && !this.cgcCpf.equals(other.cgcCpf))) {
            return false;
        }
        return true;
    }

}

Estou ficando louco com isso… não tem lógica. Ontem criei duas classes idênticas, só mudava o nome delas. Coloquei um atributo matriz igual esse da classe Cliente. em uma classe funcionava e na outra não. Tem explicação?

Vallew

só mais uma coisa…o problema é quando eu foi fazer uma coisa desse tipo:

Cliente cli = (Cliente) HibernateUtil.getSession().load(Cliente.class,"123456789");
cli.getMatriz.getRazaoSocial();

o que está me intrigando é que o código abaixo funciona perfeitamente:

cli.getLocalEntrega.getRazaoSocial();

outro detalhe é que o campo matriz contém informação então não justifica a exception de Null Pointer Exception no primeiro exemplo.

pessoal, foi idiotice minha mesmo…reparecem que o getter e setter do atributo matriz está como final…derrrrrr
mas eu nem imaginava que o Hibernate não suportava isso…

vallew