Relaciones con Hibernate

Hola,

Tengo una tabla que guarda incidencias (id, titulo, descripción, hora de inicio, ...) y quería agrupar varias incidencias en una, cuando se realice un seguimiento de la incidencia. ¿Me podrían poner un pequeño ejemplo de como lo hacen ustedes?

Lo que necesito hacer es lo siguiente:

Cuando el usuario haga clic para seguir una incidencia, ese número de Incidencia se relacione con todas aquellas incidencias que el usuario indique que pertenecen a ella, para así luego saber que incidencias pertenecen a la primera.

Tengo los mapeos ya hechos, pero aún no tengo muy claro si hacer una relación many-to-one o one-to-many, estoy muy verde con esto. Si me pueden orientar un poco se lo agradecería.

Saludos

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de javiher

El asunto es que el usuario a

El asunto es que el usuario a veces no clica en 'seguir' o 'no seguir' cada vez que finaliza un llamada ya que cuando la llamada pasa a 'una sala de espera' lo que ocurre es que finaliza la llamada, pero al usuario no le aparece el jDialog para indicar si se sigue o no porque hago que cuando la llamada se ponga en espera que no muestre el jDialog, pero aún así guardo todos los datos de esa llamada (incluida la grabación) ya que a efectos de la PBX, es una llamada colgada (hangup), luego lo que hago para recuperarla es, bien si se pasa el tiempo que le pongo en espera, pues la PBX llama automágicamente a la extensión con la que estaba hablando, o bien el usuario puede clicar en un botón para que la PBX transfiera el canal que está con el musichold a su extensión, por lo que en ambos casos se origina una nueva llamada con nueva fecha/hora, nombre de grabación, etc..

¿Qué ocurre? que cuando se pone una llamada en espera 3 veces pues se crean 3 incidencias, cada una con un id diferente, y necesito que cuando el usuario finalice la llamada, esos 3 id de incidencias queden relacionados con el id de esta última incidencia. Y la verdad aquí es donde más me lio.

Imagen de beto.bateria

una forma seria tener 2

una forma seria tener 2 tablas, una maestra con id, titulo y talves nombre de usuario, y otra tabla con id, descripción, hora de inicio, etc. el id de la tabla maestra lo deberias de poner en el id de la segunda tabla cada ves que agregas un suceso relacionado.

Imagen de javiher

Gracias por la

Gracias por la resuesta,

Tengo la tabla maestra, que sería la que tiene el idIncidencia, título, descripción, hora, ... y he creado otra con dos columnas ID y RELACIONADAS
en esta última es donde quisiera añadir lo IDs de las incidencias relacionadas.

Sino me equivoco sería una relación one-to-many ya que una Incidencia puede tener varias incidencias asociadas.

En la segunda tabla lo que he hecho es esto, pero no sé si estaría bien, creo que no, creo que no he entendido lo que me aconsejas beto:

<hibernate-mapping>
    <class name="es.jsys.cdr.oracle.DetalleIncidencias" table="DETALLE_INCIDENCIAS" schema="JSYS">
        <id name="id" type="integer">
            <column name="ID" precision="0" />
            <generator class="identity" />
        </id>
        <property name="relacionadas" type="integer">
            <column name="RELACIONADAS" precision="0" />
        </property>
        <set name="relacionadas" inverse="true" lazy="true">
            <key>
                <column name="RELACIONADAS" />
            </key>
            <one-to-many class="es.jsys.cdr.oracle.DetalleLlamadas" />
        </set>
    </class>
</hibernate-mapping>

Saludos

Imagen de javiher

Hola de nuevo, Me faltaba

Hola de nuevo,

Me faltaba crear un objeto que guardase todas las IDs de las incidencias relacionadas, ya lo he hecho, ahora cada vez que se pone en espera una llamada se va incrementado un ID, y cuando la llamada finaliza se muestra así en el output:

El Array tiene [43, 44, 45, 46, 47, 48, 49, 50]

Ahora tendría que iterar ese Array para ir guardando uno a uno en la base de datos, pero ahí me pierdo (no en iterar, sino en como guardarlos), se supone que mapeando bien el archivo de hibernate debería quedarme un método para ir seteándolos? o no?

Saludos

[editado] PD: El ID maestro debería de ser el 51, cuando se finaliza la llamada y todos los demás IDs deberían de estar relacionados con él.

Imagen de beto.bateria

mmm, la verdad no se como se

mmm, la verdad no se como se resolveria en hibernet, pero si seria una relación one-to-many.

Imagen de javiher

Seguro que es algo sencillo,

Seguro que es algo sencillo, pero sinceramente me está matando.

Gracias Beto

Imagen de Nopalin

Hola

A mi se me ocurre lo siguiente.

Ya que tienes una tabla incidencia, agregar un campo mas de tipo ManyToOne nullable. Este campo es del mismo tipo u objeto de la Incidencia, es decir el objeto Incidencia tiene una propiedad de su mismo tipo, algo asi como ownedBy o propietario.

Entonces cuando termines todo el show de las llamadas, tu sabes que id's de incidencias se crearon, bueno pues a los primeros los actualizas con la ultima creada.

ya despues cuando quieras saber las incidencias relacionadas a una en especifico haces un query como este:

//hibernate session
getSession().createCriteria(Incidencia.class)
    .add(Property.forName("propietario").eq(incidencia))
    .list();

La otra seria utilizar una relacion many-to-many pero se me hace mas complejo.

Saludos

Imagen de javiher

Gracias Nopalin, Una cosa,

Gracias Nopalin,

Una cosa, para no complicarme la vida,

Borrando los mapping files y los Pojos, estableciendo la relación en la Base de Datos y luego volviendo a crear los mapping files y los Pojos se crearán las relaciones automágicamente, por lo que no es necesario que lo establezca de forma manual.

Tengo una tabla Maestra con una columna con clave primaria que es ID_INCIDENCIA

Para simplemente añadir los IDs que estén relacionados en una columna, lo que se me ocurre es crear otra tabla DETALLES_INCIDENCIAS con dos columnas ID e ID_INCIDENCIA_RELACIONADA ambas son de tipo Number, que luego Hibernate las declara como Big_Decimal y lo que hago tanto en los mapping files como en los Pojos es cambiar ese tipo por Integer.

¿Qué tendría que hacer en la tabla DETALLES_INCIDENCIAS para que quedará relacionada con la columna ID_INCIDENCIA de la tabla Maestra?

Saludos

Imagen de Nopalin

Deja de ver tablas

Para empezar, deja de pensar en tablas y bases de datos, si ya estas utilizando hibernate empieza a pensar en objetos y sus relaciones.
En segundo, veo que estas utilizando mapeos en xml, sería mas fácil que utilizaras anotaciones, pero eso ya es cuestion de gustos.

No entiendo muy bien como lo estás visualizando, pero veo que tu quieres tener en una tabla separada la relacion. Bueno eso es relativamente sencillo. El ejemplo que voy a poner es utilizando anotaciones, ya que los xml se me hacen muy tediosos y hace años que no los uso por lo que no recuerdo como hacerlos. Basicamente tu quieres algo como esto:

@Entity
@Table(name = "incidencia")
public class Incidencia{
  //primary key de la tabla y id de la entidad, creara una columna de tipo integer
  //o number dependiendo la base de datos
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  int id;

  //... demas propiedades de la entidad

  //mapeo muchos a muchos contra otras incidencias
  @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
  @JoinTable(name = "relaciones_incidencia",
      joinColumns = @JoinColumn(name="padre_id"), inverseJoinColumns = @JoinColumn(name = "hijo_id"))
  List<Incidencia> relaciones;

  // getters y setters
}

esa entidad mapeada te creara dos tablas, una llamada incidencia que contendrá todos los datos de la incidencia y otra llamada relaciones_incidencia que almancenará las relaciones de incidencia, donde la columna padre_id será la incidencia propietaria e hijo_id sera la incidencia poseida.

Entonces por ejemplo sea lo que sea que haga tu sistema, primero creará una incidencia, y guardaras el id por ahi como referencia, creara una segunda incidencia y guardara tambien el id, creara una tercera incidencia y hará lo mismo, cuando crea la cuarta incidencia el proceso termina entonces tu lo que debes hacer es algun metodo que:

public void guardarRelaciones(int incidenciaPadreId, List<Integer> idsIncidenciasHijos){
   //supongamos que el metodo tiene acceso a la session de hibernate
  Incidencia padre = (Incidencia)getSession().get(Incidencia.class, incidenciaPadreId)

  for(Integer hijoId : idsIncidenciasHijos){
    Incidencia hijo = (Incidencia)getSession().get(Incidencia.class, hijoId)
    padre.getRelaciones().add(hijo);
  }

  //guardamos la entidad, y lo que hibernate hace es crear 3 registros en la tabla <b>relaciones_incidencia</b>,
  //ya que fue la unica propiedad del objeto que cambio, y la propiedad dice que es una relacion muchos-a-muchos
  // y que se guarda en esa otra tabla. Bueno si quieres saber mas de esto sigue leyendo sobre hibernate.
  getSession().update(padre);
}

En incidenciaPadreId pasas el id de la ultima incidencia creada, y en la lista pasas los ids de las tres primeras creadas.

sobres

Imagen de javiher

Muchísimas gracias de verdad

Muchísimas gracias de verdad

Voy a estudiarlo y a ver que tal.

Saludos