Erro com Hibernate ao salvar chaves estrangeiras nulas

0 respostas
paulofafism

Pessoal estou com grande problema. Há campos em minha tabela Cliente que possuem relacionamentos que podem conter valores nulos.

Este o mapeamento da minha classe Cliente

@javax.persistence.Entity
@org.hibernate.annotations.Entity(optimisticLock = org.hibernate.annotations.OptimisticLockType.ALL, 
                dynamicUpdate = true)  
@Table(name = "CLIENTE")
public class Cliente extends VersionPersistentObject implements Cloneable {   
    
    
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)      
    @Column(name = "CODCLIENTE", nullable = false)
    private Integer codcliente;
    
    @Column(name = "NOME", nullable = false, length=100)    
    private String nome;
    
    @Column(name = "NOMEFANTASIA", length=100)    
    private String nomeFantasia;    
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="CODPAIS", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
    private Pais pais;  
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="CODESTADO", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)  
    private Estado estado;          
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="CODCIDADE", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)  
    private Cidade cidade;         
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="CODBAIRRO", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)  
    private Bairro bairro = new Bairro();    
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="CODENDERECO", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
    private Endereco codEndereco = new Endereco();      
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="CODVENDEDOR", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)  
    private Vendedor codVendedor;    
    
    @Column(name = "COMPLEMENTO", length=60)               
    private String complemento; 
    
    @Column(name = "NUMERO", length=10)    
    private String numero;  
    
    @Column(name = "ENDCOBRANCA", length=100)    
    private String endCobranca;      
    
    @Column(name = "ENDRECEBIMENTO", length=100)    
    private String endRecebimento;    
    
    @Column(unique=true, name = "CPFCNPJ", length=18)
    private String cpfCnpj;   
    
    @Column(name = "DATANASC")
    @Temporal(TemporalType.DATE)    
    private Date datanascimento;
    
    @Column(unique=true, name = "RGIE", length=18)    
    private String rgIe;    
    
    @Column(name = "ESTCIVIL")        
    private String estadoCivil;    
    
    @Column(name = "TIPOCLIENTE", length=1)    
    private Integer tipoCliente = 1;             
    
    @Column(unique=true, name = "INCSMUNICIPAL", length=18)    
    private String inscMunicipal;    
    
    @Column(name = "TIPO", length=1)    
    private Integer tipoPessoa = 1;            
    
    @Column(name = "SITUACAO", length=1)    
    private Integer situacao = 1;                
    
    @Column(name = "DATACADASTRO")
    @Temporal(TemporalType.DATE)    
    private Date datacadastro;    
    
    @Column(name = "HORACADASTRO")
    @Temporal(TemporalType.TIME)        
    private Date horacadastro;               
    
    @Column(name = "SEXO", length=1)
    private Integer sexo = 1;                
    
    @Column(name = "NOMEPAI", length=100)    
    private String nomePai;
    
    @Column(name = "NOMEMAE", length=100)    
    private String nomeMae;    

    @Column(name = "CONTATO", length=100)    
    private String contato;        
    
    @Column(name = "EMAIL1", length=100)    
    private String email1;        
    
    @Column(name = "EMAIL2", length=100)    
    private String email2;            
    
    @Column(name = "EMAIL3", length=100)    
    private String email3;           
    
    @Column(name = "OBSERVACAO", length=500)    
    private String observacao;

Este e o mapeamento da minha classe Endereco

@javax.persistence.Entity
@org.hibernate.annotations.Entity(optimisticLock = org.hibernate.annotations.OptimisticLockType.ALL, 
                dynamicUpdate = true)  
@Table(name = "ENDERECO")
public class Endereco extends AbstractPersistentObject implements Serializable, Cloneable{
    
    private static final long serialVersionUID = 1L;   
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)      
    @Column(name = "CODENDERECO",  nullable = false)
    private Integer codEndereco;
    
    @Column(name = "NOME", length=100) 
    private String nome;                                                     
    
    @Column(name = "COMPLEMENTO", length=60) 
    private String complemento;                 
    
    @Column(name = "CEP", length=9) 
    private String cep;
    
    @Column(name = "TIPO") 
    private Integer tipo;        
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="CODBAIRRO", insertable=true, updatable=true)
    @Fetch(FetchMode.JOIN)     
    private Bairro codBairro;    
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="CODCIDADE", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)     
    private Cidade codCidade;         
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="CODTIPOLOGRADOURO", insertable=true, updatable=true)
    @Fetch(FetchMode.JOIN)
    private TipoLogradouro codTipoLogradouro;     
    
    @CollectionOfElements
    @JoinTable(name = "Cliente",
              joinColumns = @JoinColumn(name = "CODENDERECO"))
    @OneToMany(mappedBy="codEndereco")
    @Cascade(CascadeType.SAVE_UPDATE)
    @Column(name="CODCLIENTE")
    @OrderBy("codcliente")
    private Set<Cliente> cliente;       
    
    @Column(name = "EXCLUSIVO", length=1)    
    private Integer exclusivo = 0;     
    
    @Column(name = "REC_DEL", length=1)    
    private Integer rec_Del = 0;    
    
    @javax.persistence.Version
    @Column(name = "VERSION")
    @javax.persistence.Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private java.util.Date recVersion;

O problema ocorre quando tento salvar um Cliente sem ter endereço, No meu banco o campo endereço não é obrigatório, mas o hibernate não deixar eu salvar sem ter um endereço. Agora pergunto, como faço para o hibernate salvar chaves estrngeiras nulas

Essse e o erro que ocorre
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: oberon.dominio.Bairro
        at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)
        at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
        at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:242)
        at org.hibernate.type.TypeFactory.findDirty(TypeFactory.java:597)
        at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:3128)
        at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:479)
        at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:204)
        at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:127)
        at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
        at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
Criado 21 de novembro de 2008
Respostas 0
Participantes 1