Problemas ao persistir

11 respostas
vcsmetallica

Galera,

seguinte tenho tres tabelas :cliente, empresa e de endereco. Quando mando persistir cliente esta dando o seguinte erro:

Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.centrooeste.dominio.Empresa.cliente
	at org.hibernate.engine.Nullability.checkNullability(Nullability.java:72)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:290)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
	at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:49)
	at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:131)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:87)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:609)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:601)
	at org.hibernate.engine.EJB3CascadingAction$1.cascade(EJB3CascadingAction.java:30)
	at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
	at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
	at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
	at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:334)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
	at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:49)
	at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:131)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:87)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:213)
	... 25 more

A unica coisa que eu sei e que esta indo valor null, e com isso deve ser a chave da tabela emrpesa que esta indo como nula. Como eu resolvo esse problema?

Tabela Cliente

import static javax.persistence.GenerationType.IDENTITY;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


@Entity
@Table(name = "cliente", catalog = "projeto_centro_oeste")
public class Cliente implements java.io.Serializable {

	
	private static final long serialVersionUID = -1229152608080075259L;
	// Fields
	@Id
	@GeneratedValue(strategy =GenerationType.AUTO)
	@Column(name = "id", unique = true, nullable = false)
	private Integer id;
	@Column(name = "nome", length = 50)
	private String nome;
	@Column(name = "cpf", length = 20)
	private String cpf;
	@Temporal(TemporalType.DATE)
	@Column(name = "data_nascimento", length = 10)
	private Date dataNascimento;
	@Temporal(TemporalType.DATE)
	@Column(name = "data_cadastro", length = 10)
	private Date dataCadastro;
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "cliente")
	private Set<Empresa> empresas = new HashSet<Empresa>(0);

	// Constructors

	/** default constructor */
	public Cliente() {
	}
         //Get e Sets dos atributos
}

Tabela Empresa

import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;


@Entity
@Table(name = "empresa", catalog = "projeto_centro_oeste")
public class Empresa implements java.io.Serializable {

	
	private static final long serialVersionUID = -7817959290878002099L;
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "id", unique = true, nullable = false)
	private Integer id;
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "cliente_id", nullable = false)
	private Cliente cliente;
	@Column(name = "nome", length = 50)
	private String nome;
	@Column(name = "nome_fantasia", length = 45)
	private String nomeFantasia;
	@Column(name = "cnpj", length = 20)
	private String cnpj;
	@Column(name = "logomarca")
	private String logomarca;
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "empresa")
	private Set<Endereco> enderecos = new HashSet<Endereco>(0);
	// Constructors

	/** default constructor */
	public Empresa() {
	}
        //Get e Sets dos atributos
}

Tabela Endereco

import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "endereco", catalog = "projeto_centro_oeste")
public class Endereco implements java.io.Serializable {

	
	private static final long serialVersionUID = 2539125249339628761L;
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "id", unique = true, nullable = false)
	private Integer id;
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "empresa_id", nullable = false)
	private Empresa empresa;
	@Column(name = "logradouro")
	private String logradouro;
	@Column(name = "numero", length = 5)
	private String numero;
	@Column(name = "complemento", length = 20)
	private String complemento;
	@Column(name = "bairro", length = 20)
	private String bairro;
	@Column(name = "cep", length = 20)
	private String cep;
	
	// Constructors

	/** default constructor */
	public Endereco() {
	}
        //Get e Sets dos atributos
}

11 Respostas

rchgonzaga

Opaaa, bom dia

O erro fala que quando vc tenta persistir Empresa, provavelmente voce não esta colocando uma referencia de cliente ela!

Posta o código ai que você esta usando para persistir.

Abraços

B

Mude o cascade = CascadeType.ALL para cascade = CascadeType.PERSIST.

Cherubini

Fala cara

blz?

então acho q sei o problema

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "cliente")   
    private Set<Empresa> empresas = new HashSet<Empresa>(0);

Tira esse 0 do HashSet porque ele sempre vai dar a Exception

Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value:

Qualquer coisa da um toque!!

OBS: tira de todas as classes que estiverem assim.

Abraços

flw

B

Cherubini:
Fala cara

blz?

então acho q sei o problema

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "cliente")   
    private Set<Empresa> empresas = new HashSet<Empresa>(0);

Tira esse 0 do HashSet porque ele sempre vai dar a Exception

Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value:

Qualquer coisa da um toque!!

OBS: tira de todas as classes que estiverem assim.

Abraços

flw


???

O parâmetro no construtor do HashSet é a capacidade inicial, para diminuir a quantidade de memória alocada. Não tem nada a ver com a exception.

vcsmetallica

Então, eu já havia feito isso e nada.

Com relação ao codigo que persiste vou postar hoje a noite.

Atenciosamente

vcscastro

rchgonzaga

Isso, acho que vai esclarecer melhor o problema

Abraço!!

vcsmetallica

Galera,

Segue o meu codigo onde estou fazendo a persistencia

public void testSave() {
		try{
			IClienteDAO clienteDAO = ClienteDAO.getFromApplicationContext(CentroOesteFactory.buscarFactory());
			//TransactionStatus 
			Cliente cliente = new Cliente();
			cliente.setId(new Integer(1));
			cliente.setCpf("[telefone removido]");
			cliente.setDataCadastro(new Date());
			cliente.setDataNascimento(new Date());
			cliente.setNome("Teste");
			
			Empresa empresa = new Empresa();
			empresa.setId(new Integer(2)); 
			empresa.setCnpj("[telefone removido]");
			empresa.setNome("Teste empresa 1");
			empresa.setNomeFantasia("Teste fantasia 1");
			
			Endereco endereco = new Endereco();
			endereco.setId(new Integer(1));
			endereco.setBairro("bairro 1");
			endereco.setCep("cep 1");
			endereco.setComplemento("complemento 1");
			endereco.setLogradouro("logradouro 1");
          
                        Set<Endereco> enderecos = new HashSet<Endereco>();
			enderecos.add(endereco);
			empresa.setEnderecos(enderecos);
                       
                        Set<Empresa> empresas = new HashSet<Empresa>();
			empresas.add(empresa);

                        cliente.setEmpresas(empresas);
                        clienteDAO.save(cliente);
}catch(Exception e){}}
public void save(Cliente entity) {
		logger.info("saving Cliente instance");
		try {
			TransactionStatus status = txManager.getTransaction(new DefaultTransactionDefinition()); 
			getJpaTemplate().persist(entity);
			txManager.commit(status);
			logger.info("save successful");
		} catch (RuntimeException re) {
			logger.error("save failed", re);
			throw re;
		}
	}

Estou usando Spring tambem.
E isso ai galera!!!

vcsmetallica

rchgonzaga:
Opaaa, bom dia

not-null property references a null or transient value: br.com.centrooeste.dominio.Empresa.cliente

O erro fala que quando vc tenta persistir Empresa, provavelmente voce não esta colocando uma referencia de cliente ela!

Posta o código ai que você esta usando para persistir.

Abraços

Galera,

Fiz o que foi sugerido e deu certo.
Valeu pela ajuda galera.

Inte!

rchgonzaga

Deu certo ?? a propriedade nao tava sendo setada??? abraço

vcsmetallica

Deu certinho. Era a propriedade que não estava setada.

Valeu mais uma vez galera.

rchgonzaga

Flwwwwwww, qq coisa da uma grito ai

Abraço

Criado 22 de julho de 2009
Ultima resposta 24 de jul. de 2009
Respostas 11
Participantes 4