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
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) {
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"
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.
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?
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.