Erro em relacionamento

Boa tarde pessoal!

estao acontecendo os seguinte erros quando vou persistir meu objeto MeioDepositoOrigemDebito[code]Could not execute JDBC batch update

insert into MeioDepositoOrigemDebito (meioDeposito_id, valor, versao, id) values (?, ?, ?, ?)

BatchUpdateException: Entrada em lote 0 insert into MeioDepositoOrigemDebito (meioDeposito_id, valor, versao, id) values (3, 120.0, 0, 28) foi abortada. Chame getNextException para ver a causa.

PSQLException - ERROR: insert or update on table “meiodepositoorigemdebito” violates foreign key constraint "fkcfb0233b97fc594a"
Detalhe: Key (id)=(28) is not present in table “meiodeposito”.[/code]
minha classe MeioDepositoOrigemDebito com o mapeamento do objeto MeioDeposito[code]@Entity
public class MeioDepositoOrigemDebito implements Serializable {

@Id
@SequenceGenerator(name="MeioDepositoOrigemDebitoId",allocationSize=1, sequenceName="MeioDepositoOrigemDebitoId")
@GeneratedValue(generator="MeioDepositoOrigemDebitoId", strategy=GenerationType.SEQUENCE)
private Long id;

@Version
private Long versao;

@NotNull(message="O valor deve ser informado!")
@javax.validation.constraints.Min(0)
@Column(columnDefinition="Numeric(10,2)")
private Double valor;

@OneToOne(optional = false, orphanRemoval = false)
@NotNull(message="O meio de deposito deve ser informado!")
private MeioDeposito meioDeposito;

public MeioDepositoOrigemDebito(){
}

//getters and setters

}[/code]

Alguem tem noçao do que possa estar acontecendo?

Olhe a mensagem de erro: Key (id)=(28) is not present in table “meiodeposito”.

Esse cara já foi persistido? Esse que está com id 28? Ele não está sendo localizado na hora do insert.

Esta exception é lançada quando ocorre problema com atualização em lote. Por favor poste o codigo do metodo que vc salva.

Hebert Coelho, o id=28 eh o do MeioDepositoOrigemDebito… o problema eh que ele ta acusando que esse id nao esta no MeioDeposito, que eh outra coisa…

o objeto Debito possui uma lista de MeioDepositoOrigemDebito que cada um possui relacionamento com um MeioDeposito ja existente…
segue abaixo o codigo da inclusao do Debito:
parametros: listaIdMeioDeposito=“3|4”, listaValorMeioDeposito=“120.0|30.0”[code]public void incluir(final Debito debito, String valor, Long idMeioDebito, String listaIdMeioDeposito, String listaValorMeioDeposito) {

	MeioDebito meioDebito = mDebDao.consultar(idMeioDebito);
	debito.setMeioDebito(meioDebito);
	
	String[] ids = listaIdMeioDeposito.split("\\|");
	String[] valores = listaValorMeioDeposito.split("\\|");
	
	List<MeioDepositoOrigemDebito> listaMeioDepositoOrigemDebito = new ArrayList<MeioDepositoOrigemDebito>();
	for (int i = 0; i < ids.length; i++) {
		MeioDepositoOrigemDebito meioDepositoOrigemDebito = new MeioDepositoOrigemDebito();
		
		Long idMeioDeposito = Long.parseLong(ids[i]);
		MeioDeposito meioDeposito = mDepDao.consultar(idMeioDeposito);
		meioDepositoOrigemDebito.setMeioDeposito(meioDeposito);
		
		Double valDouble = Double.parseDouble(valores[i]);
		meioDepositoOrigemDebito.setValor(valDouble);
		
		listaMeioDepositoOrigemDebito.add(meioDepositoOrigemDebito);
	}
	debito.setListaMeioDepositoOrigemDebito(listaMeioDepositoOrigemDebito);
	
	String valorProntoParaConversao = valor.replace(".", "").replace(",", ".");
	Double valorDouble = Double.parseDouble(valorProntoParaConversao);
	debito.setValor(valorDouble);
	
	debito.setDataCriacao(new Date());
	debito.setIdCenario(this.usuarioWeb.getIdCenario());
	
	validarDebito(debito);
	try{
		debDao.incluir(debito);
	}catch (Exception e) {
		System.out.println(e.getMessage());
	}

}[/code]

apenas para detalhar mais o erro:

Could not execute JDBC batch update; SQL [insert into MeioDepositoOrigemDebito (meioDeposito_id, valor, versao, id) values (?, ?, ?, ?)]; constraint [null]
[/code][code]
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
[/code][code]
java.sql.BatchUpdateException: Entrada em lote 0 insert into MeioDepositoOrigemDebito (meioDeposito_id, valor, versao, id) values (3, 1.2, 0, 34) foi abortada. Chame getNextException para ver a causa.
[/code][code]
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "meiodepositoorigemdebito_meiodeposito_id_key"

Por favor, alguém tem alguma idéia pra me ajudar?

esse eh o erro do console do Eclipse:

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.LazyInitializationException: could not initialize proxy - no Session at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87) at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:680) Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215) at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190) at br.com.website.bean.MeioDebito_$$_javassist_9.getValorTotal(MeioDebito_$$_javassist_9.java) at br.com.website.controller.DebitoController.incluir(DebitoController.java:154) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61) ... 43 more

Este erro acontece quando o hibernate retorna um objeto preenchido da sua consulta, e neste objeto vc tem uma coleção que está mapeada como Lazy, ou seja, somente será preenchida quando vc acessá-la (select na base de dados para preenche-la). Se vc for acessá-la somente depois q sua conexao for fechada, obviamente o hibernate não terá como buscar esta collection, e então a exceção é lançada.
Li uma vez que através de filters vc consegue fazer umas manobras, e o Spring tbem consegue contornar este erro, mas qdo aconteceu comigo, fiz com gambiarra mesmo hehe, dei um get na collection somente pro hibernate preencher este objeto, e aih ficava em memória e conseguia acessá-los normalmente.

espero ter ajudado.

Falows

gente, eu soh deixei o mapeamento assim e agora ele ta incluindo sem dar erro:@OneToOne @NotNull(message="O meio de deposito deve ser informado!") private MeioDeposito meioDeposito;

Soh tem um problema… quando existem, por exemplo, 4 objetos MeioDepositoOrigemDebito na lista dentro do objeto Debito, sao persistidos 4 objetos Debito iguais…
acredito que a logica de inclusao de Debito esteja certa…

Alguém sabe me dizer porque esta persistindo o objeto Debito o mesmo numero de vezes que a quantidade de MeioDepositoOrigemDebito que existem na lista?

Sobre o ultimo erro que você teve, leia esse artigo: Quatro soluções para LazyInitializationException.

Ele explica o problema e dá a solução.

Obrigado Hebert, mas eu vou deixar soh o @OneToOne que ja faz o que eu preciso que faça…

O problema que esta me atordoando agora eh que ele esta persistindo o objeto Debito a mesma quantidade de vezes que o numero de objetos na lista de MeioDepositoOrigemDebito…

[quote=tefo]Obrigado Hebert, mas eu vou deixar soh o @OneToOne que ja faz o que eu preciso que faça…

O problema que esta me atordoando agora eh que ele esta persistindo o objeto Debito a mesma quantidade de vezes que o numero de objetos na lista de MeioDepositoOrigemDebito…[/quote]Ok, boa sorte.

posso criar outro tópico sobre esse problema?

[quote=tefo]posso criar outro tópico sobre esse problema?[/quote]Eu ainda acho que é o mesmo problema, mas vai lá! [=

é bom que começa o zero. [=