[Resolvido] Hibernate @OneToOne - Problema com null values

2 respostas
Mr_Arthur

Tenho um relacionamento @OneToOne entre um produto e uma marca.
Eu não quero necessáriamente obrigar um produto a ter uma marca... Poderia ter um null aqui.
Porém estou tendo erros quando vou cadastrar um produto sem a marca.
Segue os códigos;

@Entity
public class Produto {
...
	@OneToOne(optional=true)
	@JoinColumn(name = "id_marca", referencedColumnName = "id_marca", nullable = true)
	public Marca getMarca() {
		return marca;
	}
...
}

A relação é unidirecional, portanto, a classe Marca não faz referencia alguma para Produto.
Ao tentar fazer o persist sem setar uma marca, o erro a seguir me é lançado.

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
	org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
	org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:44)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor.intercept(CommonsUploadMultipartInterceptor.java:102)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

root cause

java.sql.BatchUpdateException: Entrada em lote 0 insert into tb_produto (ds_produto, sn_destaque, id_marca, nm_produto, ds_preco, id_produto) values ( , 0, 0, , NULL, 121) foi abortada. Chame getNextException para ver a causa.
	org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2530)
	org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1317)
	org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:350)
	org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2592)
	org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
	org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:44)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor.intercept(CommonsUploadMultipartInterceptor.java:102)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Acho que o problema é realmente a Marca porque quando vou persistir com ela, tudo passa ok.

2 Respostas

Flavio_Almeida

Olha, rapidamente falando:
Marca está recebendo um valor diferente de Nulo, ou seja, 0, então, o hibernate acredita que esse Id é de uma entidade.
Se o problema não for este, verifique o preço que está nulo.

Abraço

Mr_Arthur

Beleza Flávio, é isso mesmo.
Estou setando null para marca no meu objeto produto e está passando beleza.

Obrigado.

Criado 12 de outubro de 2010
Ultima resposta 13 de out. de 2010
Respostas 2
Participantes 2