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

Inserción por lotes en una relacion muchos a muchos con hibernate

Estas en el tema de Inserción por lotes en una relacion muchos a muchos con hibernate en el foro de Java en Foros del Web. Hola compañeros , bueno directo al grano... como lo dice el título, quisiera realizar una inserción por lotes en mi base de datos con hibernate ...
  #1 (permalink)  
Antiguo 08/11/2010, 21:35
 
Fecha de Ingreso: septiembre-2009
Ubicación: Guatemala
Mensajes: 10
Antigüedad: 11 años, 7 meses
Puntos: 0
Inserción por lotes en una relacion muchos a muchos con hibernate

Hola compañeros , bueno directo al grano... como lo dice el título, quisiera realizar una inserción por lotes en mi base de datos con hibernate en una tabla que tiene una relación de muchos a muchos. Si alguien me pudiera orientar se lo agradecería mucho.

Ahh por cierto las tablas son Telefono, Prospecto, ProspectoTelefono; los datos los obtengo de un archivo xml, gracias
  #2 (permalink)  
Antiguo 09/11/2010, 13:00
 
Fecha de Ingreso: octubre-2010
Mensajes: 21
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Inserción por lotes en una relacion muchos a muchos con hibernate

Hola

Y Como lo estas intentando hacer?

Bueno, si hablas de una relacion de muchos a muchos estas hablando de dos entidades, no es asi?

Pero tu mencionas que tienes 3, Telefono, Prospecto y ProspectoTelefono...

Si lo que quieres es hacer una relacion por un lado entre Telefono y TelefonoProspecto y por otro lado entre Prospecto y ProspectoTelefono, entonces no se trata de una relacion muchos a muchos sino de dos relaciones uno a muchos.

Para ello lo que tiens que hacer es lo siguiente:

1º Llena primero los atributos de la entidad Telefono

Telefono t = new Telefono(llena los atributos);

2º Llena luego los atributos de la entidad Prospecto

Prospecto p = new Prospecto(llena los atributos);

3º Llena los atributos de ProspectoTelefofono
ProspectoTelefono pt = new ProspectoTelefono(t, p);

4º Atribuir a Telefono y Prospecto la entidad ProspectoTelefonoRelacionada, por ej.
t.setProspectoTelefono(pt);
p.setProspectoTelefono(pt);

4º Haz el persist de Prospecto telefono en tu sesion

em.persist(pt);

Listo, deberia funcionar.

Ahora, claro que hay miles de variables y formas de implementarlo, como yo desconosco el contexto en el cual trabajas y teniendo en cuenta de la generalidad de tu pregunta, respondo simplemente de acuerdo a mi interpretacion,

Espero te haya ayudado

Un cordial Saludo.

Marcos Jara
[URL]http://tutorialjava7.wordpress.com[/URL]
[URL]http://www.marcosjara.com[/URL]
  #3 (permalink)  
Antiguo 09/11/2010, 16:44
Usuario no validado
 
Fecha de Ingreso: junio-2008
Mensajes: 386
Antigüedad: 12 años, 10 meses
Puntos: 10
Respuesta: Inserción por lotes en una relacion muchos a muchos con hibernate

Hola,

Esta bien como lo planteas, debes de tener tres entidades, de las cuales solo dos se mapean, y cada una tiene un atributo de tipo Set, es decir, una entidad tiene una coleccion de la otra y viceversa.

Lo que tienes que hacer es simplemente manejar los metodos de las colecciones segun el caso que sea, por ejemplo, para agregar/insertar debes de utilizar el metodo add(), para borrar usar el metodo remove() de las colecciones.

Ejemplo:

EntidadUno uno=(EntidadUno)session.load(EntidadUno.class, new Integer("1"));
EntidadDos dos=(EntidadDos)session.load(EntidadDos.class, new Integer("2"));

Supongamos que le quieres agregar a la entidad uno la entidad dos, esto se haria asi:

uno.getListaEntidadesDos().add(uno);

Eso es todo.

Cualquier cosa nos avisas!!

Saludos!
  #4 (permalink)  
Antiguo 09/11/2010, 19:25
 
Fecha de Ingreso: septiembre-2009
Ubicación: Guatemala
Mensajes: 10
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Inserción por lotes en una relacion muchos a muchos con hibernate

Que tal Marcos!!! Te respondo:
Cita:
Iniciado por tutorialjava Ver Mensaje
Y Como lo estas intentando hacer?
Bueno la verdad, hace poco descubri Hibernate y me parecio fantastico jajajaj.... pero por la misma falta de experiencia se me ocurrieron algunas ideas (las cuales hasta cierto puntos me parecen ineficientes o tediosas).... te menciono una de ellas:
Tengo 3 clases Prospecto, Telefono y ProspectoTelefono; cuyos atributos para cada una de ellas son los siguientes:
Código java:
Ver original
  1. public class Prospecto implements java.io.Serializable {
  2.     private static final long serialVersionUID = 1L;
  3.    
  4.     private ProspectoId id;
  5.     private Ocupacion ocupacion;
  6.     private Origen origen;
  7.     private String nombres;
  8.     private String apellidos;
  9.     private boolean socio;
  10.     private Date fechaLlamada;
  11.     private boolean asitencia;
  12.     private Byte tiempoReciclaje;
  13.     private Set<ProspectoTelefono> prospectoTelefonos = new HashSet<ProspectoTelefono>(0);
Código java:
Ver original
  1. public class Telefono implements java.io.Serializable {
  2.     private static final long serialVersionUID = 1L;
  3.    
  4.     private TelefonoId id;
  5.     private CodigoArea codigoArea;
  6.     private String estado;
  7.     private String sufijo;
  8.     private Set<ProspectoTelefono> prospectoTelefonos = new HashSet<ProspectoTelefono>(0);
Código java:
Ver original
  1. public class ProspectoTelefono implements java.io.Serializable {
  2.     private static final long serialVersionUID = 1L;
  3.    
  4.     private ProspectoTelefonoId id;
  5.     private Telefono telefono;
  6.     private Prospecto prospecto;
  7.     private String estado;
  8.     private boolean citaConcertada;
Creo los objetos Prospecto, Telefono, ProspectoTelefono y posteriormente mando a grabar con session.save() a cada uno de mis objetos. Esto significaria 3 llamadas a mi DB y estoy hablando de miles de objetos mmm.... bueno talvez menos dado que uso lotes, como dije antes creo que es muy ineficiente.

Cita:
Iniciado por tutorialjava Ver Mensaje
Bueno, si hablas de una relacion de muchos a muchos estas hablando de dos entidades, no es asi?

Pero tu mencionas que tienes 3, Telefono, Prospecto y ProspectoTelefono...
La tabla ProspectoTelefono me sirve para romper la relación muchos a muchos que existe entre las tablas Prospecto y Telefono
Cita:
Iniciado por tutorialjava Ver Mensaje
Si lo que quieres es hacer una relacion por un lado entre Telefono y TelefonoProspecto y por otro lado entre Prospecto y ProspectoTelefono, entonces no se trata de una relacion muchos a muchos sino de dos relaciones uno a muchos.

Para ello lo que tiens que hacer es lo siguiente:

1º Llena primero los atributos de la entidad Telefono

Telefono t = new Telefono(llena los atributos);

2º Llena luego los atributos de la entidad Prospecto

Prospecto p = new Prospecto(llena los atributos);

3º Llena los atributos de ProspectoTelefofono
ProspectoTelefono pt = new ProspectoTelefono(t, p);

4º Atribuir a Telefono y Prospecto la entidad ProspectoTelefonoRelacionada, por ej.
t.setProspectoTelefono(pt);
p.setProspectoTelefono(pt);

4º Haz el persist de Prospecto telefono en tu sesion

em.persist(pt);

Listo, deberia funcionar.
En está parte que mencionas me surge una duda : ¿Es posible crear los objetos Prospecto, Telefono y ProspectoTelefono y al momento de darle un save o persist a mi objeto ProspectoTelefono automaticamente se hacen persistentes los objetos Prospecto y Telefono?

Gracias Marcos por tu respuesta .
  #5 (permalink)  
Antiguo 09/11/2010, 19:41
 
Fecha de Ingreso: septiembre-2009
Ubicación: Guatemala
Mensajes: 10
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Inserción por lotes en una relacion muchos a muchos con hibernate

Que tal Bunburyscom!! A continuación, respondo tu cita:
Cita:
Iniciado por Bunburyscom Ver Mensaje
Hola,

Esta bien como lo planteas, debes de tener tres entidades, de las cuales solo dos se mapean, y cada una tiene un atributo de tipo Set, es decir, una entidad tiene una coleccion de la otra y viceversa.

Lo que tienes que hacer es simplemente manejar los metodos de las colecciones segun el caso que sea, por ejemplo, para agregar/insertar debes de utilizar el metodo add(), para borrar usar el metodo remove() de las colecciones.

Ejemplo:

EntidadUno uno=(EntidadUno)session.load(EntidadUno.class, new Integer("1"));
EntidadDos dos=(EntidadDos)session.load(EntidadDos.class, new Integer("2"));

Supongamos que le quieres agregar a la entidad uno la entidad dos, esto se haria asi:

uno.getListaEntidadesDos().add(uno);

Eso es todo.

Cualquier cosa nos avisas!!

Saludos!
El ejemplo que tú me colocas ya lo leí con anterioridad en la documentación de Hibernate, el problema que se me presenta es que estoy leyendo toda la información desde un archivo xml y por ende, no tengo a ninguno de mis objetos Prospecto, Telefono o ProspectoTelefono persistentes en mi BD; si lo hago de la forma en que me indicas primero debería de persistir a todos mis objetos Prospecto y posteriormente realizar una carga para cada uno de ellos y agregar los objetos Telefono que corresponda a cada Prospecto.
Bueno agradezco tu ayuda Bunburyscom, como respondi con anterioridad a Marcos soy novato con Hibernate y obviamente he de tener posiblemente algunos concpetos erroneos pero con su ayuda estoy seguro de corregir esos conceptos, gracias.
  #6 (permalink)  
Antiguo 10/11/2010, 11:26
Usuario no validado
 
Fecha de Ingreso: junio-2008
Mensajes: 386
Antigüedad: 12 años, 10 meses
Puntos: 10
Respuesta: Inserción por lotes en una relacion muchos a muchos con hibernate

Cita:
Iniciado por wblackday Ver Mensaje
Que tal Bunburyscom!! A continuación, respondo tu cita:
El ejemplo que tú me colocas ya lo leí con anterioridad en la documentación de Hibernate, el problema que se me presenta es que estoy leyendo toda la información desde un archivo xml y por ende, no tengo a ninguno de mis objetos Prospecto, Telefono o ProspectoTelefono persistentes en mi BD; si lo hago de la forma en que me indicas primero debería de persistir a todos mis objetos Prospecto y posteriormente realizar una carga para cada uno de ellos y agregar los objetos Telefono que corresponda a cada Prospecto.
Bueno agradezco tu ayuda Bunburyscom, como respondi con anterioridad a Marcos soy novato con Hibernate y obviamente he de tener posiblemente algunos concpetos erroneos pero con su ayuda estoy seguro de corregir esos conceptos, gracias.

Entonces asi como dices tu seria otro analisis, la unica forma de hacer una relacion de muchos a muchos con Hibernate es asi como te comento.

Y solo se mapean dos entidades, que en tu caso seria Telefono y Prospecto, la tercer entidad no se mapea.

Pero analizando un poco puedes hacer todo lo que dices en una misma funcion, es decir, lees tu xml y creas tus instancias, hasta aqui todo facil, lo que seguiria es validar si el Telefono que le vas agregar a tu Prospecto o viceversa ya existe en la base sino, lo guarda y le asigna su nueva referencia.

Digo, todo es cosa de ver como vas a cargar tus datos y desde donde los vas a recibir, pero teniendo bien analizado y mapeadas tus relaciones con Hiberate, Hibernate se encarga de lo demas.

Saludos!
  #7 (permalink)  
Antiguo 11/11/2010, 16:30
 
Fecha de Ingreso: septiembre-2009
Ubicación: Guatemala
Mensajes: 10
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Inserción por lotes en una relacion muchos a muchos con hibernate

Cita:
Iniciado por Bunburyscom Ver Mensaje
Entonces asi como dices tu seria otro analisis, la unica forma de hacer una relacion de muchos a muchos con Hibernate es asi como te comento.

Y solo se mapean dos entidades, que en tu caso seria Telefono y Prospecto, la tercer entidad no se mapea.

Pero analizando un poco puedes hacer todo lo que dices en una misma funcion, es decir, lees tu xml y creas tus instancias, hasta aqui todo facil, lo que seguiria es validar si el Telefono que le vas agregar a tu Prospecto o viceversa ya existe en la base sino, lo guarda y le asigna su nueva referencia.

Digo, todo es cosa de ver como vas a cargar tus datos y desde donde los vas a recibir, pero teniendo bien analizado y mapeadas tus relaciones con Hiberate, Hibernate se encarga de lo demas.

Saludos!
Que tal Bunburyscom!!! Gracias por tus respuestas .... voy a eliminar mi clase ProspectoTelefono e intentare dar solución a mi problema, de la forma en que me indicas en cuanto tenga resultados posteare como me fue y si tengo problemas espero poder seguir contando con tu apoyo gracias.

Etiquetas: hibernate, inserción, muchos, relacion
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 10:20.