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)