Foros del Web » Programación para mayores de 30 ;) » Java »

=( Problema con JPA... urgente =(

Estas en el tema de =( Problema con JPA... urgente =( en el foro de Java en Foros del Web. Hola a todos amigos... "During synchronization a new object was found through a relationship that was not marked cascade PERSIST". Esa es la excepcion que ...
  #1 (permalink)  
Antiguo 22/12/2007, 16:54
 
Fecha de Ingreso: septiembre-2007
Mensajes: 56
Antigüedad: 16 años, 7 meses
Puntos: 0
=( Problema con JPA... urgente =(

Hola a todos amigos...

"During synchronization a new object was found through a relationship that was not marked cascade PERSIST". Esa es la excepcion que me lanza. Explico un poco más el problema... inserto pisos en una base de datos sin nigun problema... uno detrás de otro y no hay problema. Pero cuando borro uno e intento volver a insertar, salta esta escepcion...

Uso TopLink , java6, Struts...

Y debugeando, he visto que la excepcion salta al intentar hacer un findByProperties() del DAO de la entidad Inmueble, al hacer la query e intentar obtener el result.... dice eso, pero es que no tengo idea de que puede ser... mirando la BBDD desde el gestor, se ve como los pisos se insertan adecuadamente y se borran tb... pero ya digo, ocurre eso cuando se borra uno y se inserta el siguiente. Lo más curioso de todo es que si se vuelve a itentar insertar, se inserta bien de nuevo!!!

Alguien tiene alguna idea por favor??

Muchisimas gracias por adelantado.
  #2 (permalink)  
Antiguo 23/12/2007, 04:43
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: =( Problema con JPA... urgente =(

El problema es que estas creando un nuevo objeto hijo, asociandolo a un objeto padre y estas "grabando" el padre, pero no tienes marcada la relacion padre-hijo como para que automaticamente "grabe" los hijos en la BDD, de ahí la excepción.

Puedes marcar la relacion como "cascade PERSIST" como te dice el error, o puedes intentar grabar el hijo explicitamente.

No he usado JPA, asi que no te puedo poner exactamente como hacer ambas cosas, pero ese mismo problema ocurre con otras soluciones parecidas (Hibernate, EJB2...) y se soluciona así.
S!
  #3 (permalink)  
Antiguo 23/12/2007, 05:17
 
Fecha de Ingreso: septiembre-2007
Mensajes: 56
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: =( Problema con JPA... urgente =(

Muchas gracias por la rapidez en contestar....

la verdad es q estoy muy interesado en solucionar esto (y tengo q hacerlo en YA practicamente) así q agradezco muchisimo tu colaboración.

Lo q comentas suena muy bien y tb lei algo parecido en alguna web en ingles pero...

1) TODAS mis relaciones en el modelo de datos tienen on Update CASCADE y On delete CASCADE.

2) Solo tengo una relación de "herencia" (padre-hijo) q como antes he dicho, tiene las 2 opciones en CASCADE.

3) El error es misterioso, y explico el xq. Puedo estar insertando objetos Inmueble (con su correspondiente objeto Piso) y relacionandolo con el objeto Provincia y Propietario (no hay mas relaciones afectadas en la inserccion) indefinidamente... es decir, me imagino que el metodo insertar Inmueble estará bien... xq ya digo, se puede insertar indefinidamente. EL tema es que cuando busco un inmueble y lo elimino (tb se elimina sin problemas aparentes) la prózima insercion es la que "peta". Pero no peta en nigun save (petrsistir en la BBDD) ni nada parecido.... peta cuando se hace una búsqueda en la BBDD para ver si hay otro inmueble con las características que me mete el usuario en el formulario.... al hacer el findByProperty e intentar sacar el result me da ese error....

Muchisimas gracias, de verdad. A ver si podemos sacar adelante esto, q me tiene loco....
  #4 (permalink)  
Antiguo 23/12/2007, 05:31
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: =( Problema con JPA... urgente =(

Hola,

La relacion la has de marcar CASCADE PERSIST no en el modelo de datos, si no el mapeo relacional. No es una cuestion de SQL o la BDD, es una cuestion de JPA. Por lo que explican aquí:
http://www.oracle.com/technology/pub...gupta-jpa.html

Se pone al definir las relaciones con algo parecido a :
Cita:
@OneToMany (mappedBy = "party", fetch = FetchType.EAGER, cascade =
{CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private Collection elementosRelacionados;
Debe ser que al hacer findByProperty comprueba si lo que tiene concuerda con la BDD y segun lo que me dices... puede ser que al borrar el inmueble, le quede el objeto piso sin borrar? Entonces al darse cuenta que tiene un piso relacionado con un inmueble que no existe, peta ya que no sabe si ha de crear automaticamente el inmueble o por que no existe.

S!
  #5 (permalink)  
Antiguo 23/12/2007, 10:41
 
Fecha de Ingreso: septiembre-2007
Mensajes: 56
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: =( Problema con JPA... urgente =(

Hola de nuevo,

Muchisimas gracias por todo, la verdad es q me sirve de ayuda al menos empezar a entender xq puede pasar... pero el tema es que en los mapeos de la entidad inmueble tengo esto:

@OneToOne(cascade = CascadeType.ALL, mappedBy = "inmueble")
private PisoChalet pisoChalet;

Y en la de piso esto:

@JoinColumn(name = "Inmueble_IdInmueble", referencedColumnName = "IdInmueble", insertable = false, updatable = false)
@OneToOne
private Inmueble inmueble;

En la entidad Inmueble supongo q sería lo q te referías... pero como ves, supongo q en esa linea se indica que todos los tipos estan en cascade (update, delete e insert).

En la entidad Piso ya no se para que serán los insertable = false y updatable = false...

Muchas gracias de nuevo, de verdad.
  #6 (permalink)  
Antiguo 23/12/2007, 11:19
 
Fecha de Ingreso: septiembre-2007
Mensajes: 56
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: =( Problema con JPA... urgente =(

Por cierto GreenEyed,

El proceso del fallo es al: Insertar Inmuebles (tantas veces como se quiera y con sus respectiva entidad Hijo Piso, es decir, se hacen los 2 saves en la BBDD, un save del inmueble, y otro del piso), luego se borra un Inmueble (sólo hago un delete, el del inmueble, xq supongo q con el borrado en cascada, se borrara tb el piso) y efectivamente despues de borrar, el inmueble ya no existe NI SU PISO tampoco, al menos no se ven en la BBDD a través del gestor. Al insertar el siguiente Inmueble, es cuando salta el error... pero la posibilidad de que "puede ser que al borrar el inmueble, le quede el objeto piso sin borrar? Entonces al darse cuenta que tiene un piso relacionado con un inmueble que no existe, peta ya que no sabe si ha de crear automaticamente el inmueble o por que no existe." queda descartada no? ya q como te comento, ni el piso, ni el inmueble existen en la BDDD cuando se borra el inmueble....

Un saludo, muchisimas gracias.
  #7 (permalink)  
Antiguo 24/12/2007, 05:50
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: =( Problema con JPA... urgente =(

El problema no es que existan en la BDD, el problema es que el crea que existan en memoria y luego ve que no existen en BDD. Eso es lo que dice el mensaje de error.
Prueba a borrar el piso explicitamente a ver que te dice.
  #8 (permalink)  
Antiguo 24/12/2007, 06:46
 
Fecha de Ingreso: septiembre-2007
Mensajes: 56
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: =( Problema con JPA... urgente =(

Hola GreenEyed, y gracias de nuevo x tu ayuda.

He probado a hacer el delete(Piso) además del que ya tenia delete(Inmueble) por este orden, es decir, 1º piso y luego inmueble y nada, sigue dando el error al volver a insertar. Si se hacen los delete al reves (cosa ilógica, xq si se borra el inmueble, se borra su piso asociado (al tener el borrado en cascada tb se borra el piso)) TB DA ESE MISMO ERROR... lo q me hace replantearme su significado... Yo cuando hablo de borrar, hablo siempre de la BBDD, xq ya te comenté que no soy para nada un experto en la materia (hace unos meses que he empezado a programar y esta es mi primera aplicacion web) y para mi, cuando se hace un delete(Piso) significa que el piso de la BBDD desaparece cuando se haga el commit, y supongo q Java hará que tb deje de ocupar memoria el bean del piso que se acaba de eliminar no?.

Pero bueno, el tema es que si se hace el delete del piso antes que el de inmueble, da =, el error al volver a insertar sigue saltando.

Y luego otra puntualizacion, he probado a insertar un piso (ya sabes, siempre con su inmueble ya que piso sin inmueble y viceversa no tine sentido, ya que un piso ES UN inmueble (relacion de herencia en el modelo de datos)) y luego a través del gestor de Mysql, borrar a mano el piso insertado y volver a insertar otro. Ahí no hay problema alguno, con lo que las opciones se me cierran y aparentemente solo me queda la opcion de que borre mal el inmueble.... pero no se qué hago mal... ya te digo, para mi un simple delete(Inmueble) deberia "valer" ya q si borro el inmueble, todas las entidades que le relacionan con su id, se borran tb por el borrado en cascada... y bueno, probando a hacer explicitamente el delete del piso antes que el de inmueble tampoco hay resultado....

Muchisimas gracias de verda, siento darte la lata tanto....

Y Feliz navidad!, por cierto =P
  #9 (permalink)  
Antiguo 24/12/2007, 11:16
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: =( Problema con JPA... urgente =(

Ya te digo que con JPA no he jugueteado, asi que estos detalles no me los he encontrado, pero en Hibernate he encontrado circunstancias totalmente anti-intuitivas similares y solo queda hacer pruebas y/o preguntar en el foro de la implementación JPA que estes usando para que la gente con experiencia concreta te ayude.

Podria ser algo tan tonto como tener que hacer un flush() de la session justo despues del delete(inmueble) para que se borren en efecto los registros en la BDD, si no puede que simplemente los marque como "borrados" a falta de actualización etc. Cosas raras que a veces pasan. Lamento no poder ser de más ayuda.

Feliz Navidad a ti tambien y suerte.

S!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:24.