Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Problema JPA

Estas en el tema de Problema JPA en el foro de Oracle en Foros del Web. Hola a todos. He escrito en el foro de J2EE, pero no encontre una solución para el problema y me remitieron aquí o a algun ...
  #1 (permalink)  
Antiguo 26/12/2007, 05:24
 
Fecha de Ingreso: septiembre-2007
Mensajes: 56
Antigüedad: 17 años, 3 meses
Puntos: 0
Problema JPA

Hola a todos.

He escrito en el foro de J2EE, pero no encontre una solución para el problema y me remitieron aquí o a algun foro de TopLink... este es el primero en google, y a ver si aquí me podeis echar una mano o sino, decirme algún otro sitio que conozcais q sea una buena referencia para poder preguntar...

Os explico un poco el problema.

Estoy haciendo una aplicacion web, en la que trabajo con Struts, java 6, MySql y la implementacion de TopLink para JPA. El problema es cuanto menos curioso. Intentare ser conciso y explicito;

Se manejan básicamente 2 entidades, Inmueble y Piso (clase Hija de Inmueble, por tanto con relacion 1..1). Pues bien, tb se manejan 2 metodos esencialmente; insertar un piso y borrar un piso.

El insertar funciona correctamente (eso creo y espero jeje), ya que se puede insertar 1 piso o los que se quieran sin que nunca de ningun problema. Para insertar un piso, se hacen 2 save en la BBDD, uno para el piso y otro para el inmueble, al que le introduzco el piso en su interior.

El borrar... pues supongo que debe ser en el que algo vaya mal, pero la cuestion es que "funciona". Se hace un unico delete(), el del inmueble, ya que por la relacion de borrado en cascada que tengo en la BBDD, el piso tb se borra (esto funciona o al menos en la BBDD desaparecen ambos registros).

El problema es que al insertar N pisos, luego borrar uno cualquiera (hasta aqui todo "bien", es decir, tendremos N-1 pisos en la BBDD habiendose eliminado el inmueble y el piso que pretendiamos) y al volver a añadir un piso, salta esta excepcion:

"During synchronization a new object was found through a relationship that was not marked cascade PERSIST"

He hecho varias pruebas... poner el delete del piso en el borrar ademas del inmueble (siempre antes que el delete del inmueble, claro) y bueno, tb he hecho el proceso de insertar N pisos, borrar 1, parar el servidor de aplicaciones y la BBDD, volver a levantar todo, ver que verdaderamente en la BBDD tenía N-1 pisos y eran los correctos, insertar un piso y eso SÍ que funciona... es decir, q se debe quedar algo por ahí suelto o algo...

En fin, la verdad es que no se qué hago mal, y es por esto por lo que me remito a vosotros, a ver si me podeis echar una mano. Si quereis que os mande el codigo del insertar y el borrar decirmelo y os lo mando.

Muchisimas gracias, un saludo y felices fiestas.
  #2 (permalink)  
Antiguo 27/12/2007, 08:20
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: Problema JPA

"en la que trabajo con Struts, java 6, MySql "

y que tiene que ver con oracle?
__________________
Blogzote.com :-) Mi blog
  #3 (permalink)  
Antiguo 27/12/2007, 11:10
 
Fecha de Ingreso: septiembre-2007
Mensajes: 56
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: Problema JPA

Vaya, y yo que pensaba q encontraría una resupuesta útil... q desilusión, en fin...

kikolice, supongo que serás un experto en el foro x el montón de pot q llevas publicados, pero no se si lees correctamente los post o te quedas a medias siempre... lo digo xq no se si te has quedado justo en "en la que trabajo con Struts, java 6, MySql " y has apagado o has seguido leyendo.

Si has respondido sin leer nada más que hasta esa frase, lo entiendo (no lo comparto, xq no veo bien que se responda sin leer), pero bueno, lo entiendo.

El problema viene si de verdad has leido el post... entonces sería preocupante xq justo después de tu "en la que trabajo con Struts, java 6, MySql " va un "y la implementacion de TopLink para JPA" y no se si sabrás, que dicha implementación es de Oracle...

Siento mucho si te molesto con mis afirmaciones, pero veo una estupidez responder cosas inutiles, xq lo único que se consigue con tus post (al menos con este) es q te manden a tomar un poco por... xq las personas aquí intentan buscar soluciones a sus problemas, no greña.

Sin más q objetar, me despido. Te agradecería que si supieras darme una respuesta/consejo a mi problema me lo dieras, sino, si sólo te ocurre contestar con algo parecido a tu anterior post, mejor ahorra tiempo, que es preciado.

Muchas gracias.

Última edición por AlexCollado; 27/12/2007 a las 11:17
  #4 (permalink)  
Antiguo 27/12/2007, 13:03
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Re: Problema JPA

Hola AlexCollado,

Es importante que consideres la posibilidad de haber mal interpretando el tono en que te hicieron la pregunta, dado que para mi es una pregunta valida.

Yo no tengo la mas remota idea de lo que es la implementacion de TopLink para JPA, pero si das un poco mas de detalles, talvez consigas que algunos usuarios del foro empiecen a investigar el tema y encontrar algunas pistas para ayudarte a resolver el problema.

No pierdas de vista que esto es un foro de voluntarios, y si alguien te pide una aclaracion, lo correcto seria darla, y no mandarlo a tomar por... como lo has expresado. Por ejemplo, ¿Como se relaciona TopLink para JPA con Oracle?, ¿Cual es la pagina web del producto?, ¿Cual es la pagina web de la documentacion del producto?, ¿Que has investigado sobre el error?.

Lo unico que hice fue copiar y pegar el error que tienes en google y me aparecieron muchos resultados, entre en el primero que vi y lei..

Cita:
Este es el resultado de no haber especificado correctamente el tipo de cascada ManyToOne al final de la relación.
Ahora, se que no es de mucha ayuda pero de a poco puedes ir llegando a la solucion.

Saludos
  #5 (permalink)  
Antiguo 27/12/2007, 13:40
 
Fecha de Ingreso: septiembre-2007
Mensajes: 56
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: Problema JPA

Hola Matanga,

Pues quizá tengas razón y lo haya mal interpretado, pero mi opinión era q no era así y de ahí mi mensaje, en el cual creo q en ningun momento soy grosero y/o algo similar. Digo esto xq además no soy solo yo el que ha interpretado el mensaje así, sino más personas q estan haciendo el trabajo conmigo... pero claro que si, podemos estar equivocados, ya que como dices, no son más q interpretaciones.

En cuanto a tu aportacion, muchisimas gracias. Espero q no te lo tomes a mal, pero al menos yo suelo intentar solucionar las cosas por mi mismo (y documentacion de la web, vease Google) antes de exponer el problema en un foro para q lo hagan los demás por mí. Es por esto por lo que la mayoria de los resultados de poner la excepcion en google ya los he ojeado.

Vuelvo a decirte q muchisimas gracias por la aportacion eh? de verdad. Siento haber enfadado a los "veteranos" pero no he dicho sino más que lo q sentía en ese momento y lo más importante, creo q no fui grosero nunca.

En cuanto a tus preguntas...

¿Como se relaciona TopLink para JPA con Oracle? --> No entiendo muy bien la pregunta, pero Toplink es la implementacion de Oracle del Api de Persistencia de Java. Existen varias implementaciones de este API, toplink, hibernate... etc y yo uso TopLink, de Oracle, de ahí que mi post esté en el foro de Oracle.

¿Cual es la pagina web del producto? -->http://www.oracle.com/technology/products/ias/toplink/JPA/essentials/index.html puede ser una buena referencia.

¿Cual es la pagina web de la documentacion del producto?--> En el link anterior se encuentra documentacion también del producto, claro.

¿Que has investigado sobre el error? -->Se dicen muchas cosas por la web... que si persistir un objeto hijo antes que su padre, que si la cache de TopLink, que si las relaciones OneToOne y sus type.cascade... pero aun no he debido dar con el clavo, ya q sigo peleandome... supongo que haré algo bastante mal (soy medio nuevo en el asunto de la programacion web), pero aun no se decir más de lo que dije en el primer post q escribi a cerca del error.

Si logro averiguar que pasa, os lo haré saber.

Muchas gracias de nuevo, de verdad, no os enfadeis, pero espero q mi postura tb se entienda.
  #6 (permalink)  
Antiguo 03/01/2008, 00:22
 
Fecha de Ingreso: enero-2008
Mensajes: 197
Antigüedad: 16 años, 11 meses
Puntos: 10
Re: Problema JPA

Hola Alex, no se si estés interesado aún en la posible resolución de tu problema, he leído tu descripción y a mí me parece que te falta la declaración de cascada en tu entidad, por lo que dices respecto a la BD están bien las restricciones de integridad en cascada pero desafortunadamente al usar TopLink no las define en la entidad, debes explícitamente declararlas en tu entidad, es una anotación muy sencilla "cascade = CascadeType.ALL" la cual involucra a las siguientes "Persist", "Merge", "Remove", "Refresh". Al usar esta anotación en tus relaciones (@OneToMany, @ManyToMany etc...) no es necesario que hagas persistente el Hijo antes que el padre ya que automáticamente lo hace el Padre, no se si me explico.

Suponiendo tu ejemplo:
Tienes Entidad Inmueble y Entidad Piso

No es necesario que introduzcas primero el Piso para que así después introduzcas el Inmueble ya que como lo menciono antes, Inmueble crea el Piso automáticamente gracias a las anotaciones en cascada. ejemplo:

Inmueble inmueble = new Inmueble();
inmueble.setPiso( new Piso() );

entityManager.persist(inmueble);

en caso de que las relaciones sean a muchos es prácticamente lo mismo:

suponiendo que quieres agregar 3 pisos a un inmueble este sería mas o menos el código:

Inmueble inmueble = new Inmueble();

Collection<Piso> coleccionPisos = new ArrayList<Piso>();
coleccionPisos.add( new Piso() );
coleccionPisos.add( new Piso() );
coleccionPisos.add( new Piso() );

inmueble.setPisos( coleccionPisos );

entityManager.persist( inmueble );

Automáticamente se crea el Inmueble relacionado con sus Pisos. Por lo tanto no es necesario crear primero los pisos para después agregárselos al Inmueble.

NOTA: Asumo que tus entidades Inmueble y Piso tienen las anotaciones correspondientes a la generación automática de llaves primarias que corresponden por supuesto a los campos Key (inmueble_id o piso_id ) Auto_Increment de MySQL.


Finalmente jejeje

Suponiendo tus Entidades, éste sería el código de la anotación para Entidad Inmueble

@Entity
public class Inmueble implements java.io.Serializable {


@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE) // <-- para el auto-increment
@Column(name = "inmuebleId", nullable = false)
private Integer inmuebleId;
.
.
.

@OneToMany(cascade = CascadeType.ALL, mappedBy = "inmuebleId")
private Collection<Piso> pisoCollection;

.
.
.




}




Espero me haya explicado y que todavía te sea de utilidad, y si tienes algún otro problemilla házmelo saber y si me lo se pues te echo la mano. Saludos!

PD: me puedes mandar el código de tus entidades si quieres para que les eche un ojo ;)
  #7 (permalink)  
Antiguo 23/01/2008, 04:33
 
Fecha de Ingreso: septiembre-2007
Mensajes: 56
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: Problema JPA

Hola hualro,

antes de nada agradecerte muchisimo tu respuesta y pedir perdon por no responder antes, pero es que deje un poco de lado el tema de los foros al ver q no encontraba soluciones y hasta hoy no me he vuelto a meter a ver.

Con respecto a lo que me comentas de las relaciones padre-hijo es cierto, ya habia leido algo parecido por ahí y acabé por probarlo y efectivamente es así y es lo que hago, es decir, para insertar un piso (q tiene su inmueble relacionado, claro) sólo hago el persist del inmueble, al cual le introduzco el piso.

He de comentar que tuve algun problemilla al hacer esto, ya que la entidad Piso necesitaba tener un id asignado y no sabía como crearlo. La anotacion que inidicas no se muy bien lo que hace, pero tiene buena pinta y quiza fuera algo parecido la solucion a ese problema. Pero finalmente cree un metdo que me devolviera el ultimo id asignado en la BBDD, para así poder hacer el new() del piso asignandole el id que le correspondiera y una vez hecho esto, ya se podía hacer el persist del inmueble sin problemas.

Logré solucionar algunos problemas, pero hay otros que siguen siendo del mismo genero y que aun siguen ahí. Al final los deje un poco de lado, para poder continuar con la aplicación, pero ahora ha llegado el momento de probar la aplicacion y resolver problemas... así que me parece q me voy a tener q volver a pegar con ellos. Estaría encantado de volver a poder contar con tu ayuda si en el futuro vuelvo a exponer algun problema por aqui (q ojala que no, pero...seguro).

Hay otra cosa así de primeras que sí que se me ocurre para preguntarte (ademas de lo del id de antes). Y es lo siguiente. Las relaciones e cascada entre entidades de JPA se exitienden? me explico, imaginemos: tenemos una entidad ObraNueva que tiene un TipoObra en su interior y este tiene una coleccion de Pisos, todos y cada uno con su correspondiente Inmueble que a su vez, tienen fotos. Si lo que quiero es añadir una foto a un inmueble y tengo todas las entidades relacionadas con el type.cascade = ALL.
Si hago un obraNueva.tipoObra.piso.inmueble.setFoto(foto); y un update(obraNueva); se me debería de hacer el persist de la foto en la BBDD por las relaciones en cascada? o como lo haría?

Muchisimas gracias de antemano.
  #8 (permalink)  
Antiguo 04/02/2008, 19:22
 
Fecha de Ingreso: septiembre-2007
Mensajes: 56
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: Problema JPA

Hola otra vez

De nuevo por aqui en busca de algun alma caritativa q me pueda ayudar a coprender cosas q mi cabeza no llega a entender...

pfff, esto de JPA y demas... supongo q será mi torpeza, como lo es casi siempre al hacer este tipo de cosas, pero en fin, loco sí q me deja con las movidas que ocurren...

En fin, ya sabeis por el hilo un poco mi situacion y demas...

Ahora el problema encontrado es el siguiente:

Se va a actualizar un inmueble, el proceso se realiza, se hace el update de la entidad y el commit de la transacción, los datos son reflejados en la BBDD y hasta ahí todo perfecto.

Pues bien, al buscar los inmuebles (una query en EJB QL en la que simplemente pido todos los inmuebles), se puede observar que los datos no se han actualizado (digo mal quizá, xq el tema es que se queda con los datos de la busqeuda que se hizo antes de hacer el upadte y luego no vuelve a ver los datos REALES q EXISTEN en la BBDD)

Alguna sugerencia???

pffff
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 12:25.