java - example - onetomany jpa ejemplo




Hibernate3: objetos de autorreferencia (2)

Creo que esto funcionará ... sin pruebas.

<hibernate-mapping>
    <class name="my.proj.DirObject" table="category">
        ...   

        <set name="subDirs" lazy="true" inverse="true">
            <key column="parentId"/>
            <one-to-many class="my.proj.DirObject"/>
        </set>

        <many-to-one name="parent"
                     class="my.proj.DirObject"
                     column="parentId" cascade="all" />
    </class>
</hibernate-mapping>

Necesito ayuda para entender cómo hacer esto; Voy a ejecutar 'buscar' recursivo en un sistema de archivos y quiero mantener la información en una sola tabla de base de datos con una estructura jerárquica autorreferencial:

Esta es la estructura de mi tabla DB que quiero completar.

Tabla DirObject:

id       int NOT NULL,
name     varchar(255) NOT NULL,
parentid int NOT NULL);

Aquí está la clase de Java propuesta que quiero asignar (solo se muestran los campos):

public DirObject {
    int id;
    String name;
    DirObject parent;
...

Para el directorio 'raíz' iba a usar parentid = 0; los identificadores reales comenzarán en 1, e idealmente quiero hibernar para autogenerar los identificadores.

¿Alguien puede proporcionar un archivo de mapeo sugerido para esto, por favor? como una pregunta secundaria, pensé en hacer la clase Java así:

public DirObject {
    int id;
    String name;
    List<DirObject> subdirs;

¿Podría usar el mismo modelo de datos para cualquiera de estos dos métodos? (Con un archivo de mapeo diferente, por supuesto).

--- ACTUALIZACIÓN: así que probé el archivo de mapeo que se sugiere a continuación (¡gracias!), Repetido aquí para referencia:

<hibernate-mapping>
    <class name="my.proj.DirObject" table="category">
        ...   

        <set name="subDirs" lazy="true" inverse="true">
            <key column="parentId"/>
            <one-to-many class="my.proj.DirObject"/>
        </set>

        <many-to-one name="parent"
                     class="my.proj.DirObject"
                     column="parentId" cascade="all" />
    </class>

... y alteré mi clase de Java para tener tanto 'parentid' como 'getSubDirs' [devolviendo un 'HashSet'].

Esto parece funcionar, gracias, pero este es el código de prueba que utilicé para manejar esto. Creo que no estoy haciendo algo aquí, porque pensé que Hibernate se encargaría de guardar los objetos subordinados en el Set sin que yo tenga que hacer esto explícitamente?

DirObject dirobject=new DirObject();
   dirobject.setName("/files");
   dirobject.setParent(dirobject);

   DirObject d1, d2;
   d1=new DirObject(); d1.setName("subdir1"); d1.setParent(dirobject);
   d2=new DirObject(); d2.setName("subdir2"); d2.setParent(dirobject);
   HashSet<DirObject> subdirs=new HashSet<DirObject>();
   subdirs.add(d1);
   subdirs.add(d2);
   dirobject.setSubdirs(subdirs);


   session.save(dirobject);
   session.save(d1);
   session.save(d2);

En realidad, puede tener la siguiente entidad Java:

public DirObject {
    int id;
    String name;
    DirObject parent;
    List<DirObject> subdirs;
    ...
}

Y asócielo en la tabla DIROBJECT:

ID       int NOT NULL,
NAME     varchar(255) NOT NULL,
PARENTID int NOT NULL);

Usando la siguiente asignación:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="mypackage">

  <class name="DirObject" table="DIROBJECT">

    <id name="id" type="int">
      <column name="ID" />
      <generator class="native" />
    </id>

    <property name="name" type="string">
      <column name="NAME" length="150" not-null="true" unique="false" index="NAME" />
    </property>

    <bag name="subdirs" lazy="false" cascade="all-delete-orphan" inverse="true">
      <key column="PARENTID" />
      <one-to-many class="DirObject" />
    </bag>

    <many-to-one name="parent" class="DirObject">
      <column name="PARENTID" />
    </many-to-one>
  </class>

</hibernate-mapping>






self-reference