Tema: Problema JPA
Ver Mensaje Individual
  #6 (permalink)  
Antiguo 03/01/2008, 00:22
hualro
 
Fecha de Ingreso: enero-2008
Mensajes: 197
Antigüedad: 16 años, 10 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 ;)