Iniciando no Hibernate

6 respostas
D

Pessoal, estou com problema ao rodar o código à seguir:

package hibernate;

import java.io.Serializable;

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import <a href="http://javax.persistence.Id">javax.persistence.Id</a>;

import javax.persistence.JoinColumn;

import javax.persistence.JoinTable;

import javax.persistence.OneToOne;

import javax.persistence.Table;
@Entity

@Table(name = USER)

public class User implements Serializable {

@Id

@GeneratedValue

@Column(name = USER_ID)

private Long id;

public Long getId() {

return id;

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

@OneToOne(optional=true, cascade = CascadeType.ALL)
@JoinTable(name="UserAddress", joinColumns={
		@JoinColumn(name="USER_ID", unique=true)
}, inverseJoinColumns = {
		@JoinColumn(name="addressId")
})
private Address shippingAddress;

public Address getShippingAddress() {
	return shippingAddress;
}

public void setShippingAddress(Address shippingAddress) {
	this.shippingAddress = shippingAddress;
}

}

package hibernate;

import java.io.Serializable;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import <a href="http://javax.persistence.Id">javax.persistence.Id</a>;

import javax.persistence.OneToOne;

import javax.persistence.Table;

@Entity
@Table(name = “ADDRESS”)

public class Address implements Serializable {

@Id

@GeneratedValue

@Column(name = ADDRESS_ID)

private Long id;

private String street;

private String city;

private String zipcode;

@OneToOne(optional=true, mappedBy=shippingAddress)

private User user;
public User getUser() {
	return user;
}

public void setUser(User user) {
	this.user = user;
}
 
public Long getId() {
	return id;
}

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

public String getStreet() {
	return street;
}

public void setStreet(String street) {
	this.street = street;
}

public String getCity() {
	return city;
}

public void setCity(String city) {
	this.city = city;
}

public String getZipcode() {
	return zipcode;
}

public void setZipcode(String zipcode) {
	this.zipcode = zipcode;
}

}

package hibernate;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;
public class Example1 {

public static void main(String[] args) throws Exception {

/** Getting the Session Factory and session <em>/

SessionFactory session = HibernateUtil.getSessionFactory();

Session sess = session.getCurrentSession();

/</em>* Starting the Transaction <em>/

Transaction tx = sess.beginTransaction();

/</em>* Creating Pojo <em>/

User newUser = new User();

<a href="//newUser.setId">//newUser.setId</a>(1L);

Address shippingAddress = new Address();

newUser.setShippingAddress(shippingAddress);

shippingAddress.setUser(newUser);

/</em>* Saving POJO <em>/

sess.saveOrUpdate(newUser);

/</em>* Commiting the changes */
tx.commit();
	System.out.println("Record Inserted");
	/** Closing Session */
	

	
	session.close();
}

}

O erro lançado é:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).

log4j:WARN Please initialize the log4j system properly.

Exception in thread main org.hibernate.PropertyValueException: not-null property references a null or transient value: hibernate.Address.user

at org.hibernate.engine.Nullability.checkNullability(Nullability.java:95)

at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:313)

at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)

at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)

at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)

at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)

at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:241)

at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:292)

at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:240)

at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:193)

at org.hibernate.engine.Cascade.cascade(Cascade.java:154)

at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:454)

at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288)

at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)

at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)

at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)

at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)

at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:523)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:342)

at $Proxy11.saveOrUpdate(Unknown Source)

at hibernate.Example1.main(Example1.java:21)

ALGUÉM PODE ME AJUDAR!!!

6 Respostas

robson.simonassi

Olá bom dia,

Vc deve estar passando algum objeto nulo, e que no banco de dados deve ser NOTNULL dá uma olhadinha!!
Faça um debug e veja se não existe algum objeto nulo na classe ‘Andress’.

E configura o ‘property’ do log4j para não dar mais esta mensagem:

[color=red]og4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly. [/color]

Boa sorte!!!

D

Acho que não tem nada nulo, como pode ser visto aqui:

User newUser = new User();

Address shippingAddress = new Address();

newUser.setShippingAddress(shippingAddress);

shippingAddress.setUser(newUser);

sess.saveOrUpdate(newUser);
g4j

não basta passar somente a instância, tem que setar a chave primária (algo como user.setCodigo(codigo)) na classe User…

robson.simonassi

Tentar deixar o Objeto Estanciado dentro da classe ENTiTY

private Address shippingAddress = new Address();

public Address getShippingAddress() {
return shippingAddress;

D

Vou tentar, mas, acho que não, pois na classe User foi definido o padrão de chave-primária com a anotação:

@Id
@GeneratedValue
@Column(name = “USER_ID”)

que pode default é AUTO. Ainda assim é preciso eu definir previamente a chave? Eu acho que não…

g4j

dayserivera:
Vou tentar, mas, acho que não, pois na classe User foi definido o padrão de chave-primária com a anotação:

@Id
@GeneratedValue
@Column(name = “USER_ID”)

que pode default é AUTO. Ainda assim é preciso eu definir previamente a chave? Eu acho que não…

ok, é um novo usuário.

o mesmo vale para classe Address, tem que popular a pk

Criado 1 de abril de 2011
Ultima resposta 1 de abr. de 2011
Respostas 6
Participantes 3