2009-06-26 14 views
5

Estoy intentando construir una capa Hibernate para un esquema de base de datos sobre el que esencialmente no tengo control. Simplificado, hay dos tablas.Hibernar: Especificar columnas en una relación uno a varios

Tabla parent tiene dos columnas importantes:

  • parent_id, enteros, clave primaria, autoincremented
  • parent_code, cuerda, clave única, generada por un cuadro negro en alguna parte (digamos que se trata de un UUID por el bien de la cordura)
  • Además de un montón de columnas de datos

Tabla child tiene dos columnas importantes:

  • child_parent_id, enteros, clave primaria, autoincremented
  • child_parent_code, cuerda, apuntando clave externa a valor
  • de los padres parent_code Además de un montón de columnas de datos

Quiero poder llamar a Parent.getChilds() y obtener un objeto Collection of Child. Pero la configuración de los archivos de mapeo de Hibernate parece imposible. Lo que está haciendo con las asignaciones a continuación es buscar en la tabla child con el valor parent_id (en lugar de parent_code).

En Parent.hbm.xml:

<set name="childs" inverse="true" lazy="true" table="child" fetch="select"> 
     <key> 
      <column name="child_parent_code" not-null="true" /> 
     </key> 
     <one-to-many class="foo.bar.Child" /> 
    </set> 

En Child.hbm.xml:

<many-to-one name="parent" class="foo.bar.Parent" fetch="select"> 
     <column name="child_parent_code" not-null="true" /> 
    </many-to-one> 

He pasado una hora estudiando a través de mi copia de Java Persistence con Hibernate, pero no puedo encontrar la manera para hacer lo que quiero ¿Es posible?

Respuesta

4

intentar algo como esto en la matriz:

<set name="childs" inverse="true" lazy="true" table="child" fetch="select"> 
    <key column="child_parent_code" property-ref="code" /> 
    <one-to-many class="foo.bar.Child" /> 
</set> 

y esto en el niño:

<many-to-one name="parent" class="foo.bar.Parent" 
    fetch="select" column="child_parent_code" property-ref="code" /> 

he asumido que la propiedad del código en el padre se llama "código".

+0

El atributo de propiedad-ref funcionó por completo. ¡Gracias! – Plutor

+0

No hay problema, me alegro de que haya ayudado. –

+0

@DavidM ¿Hay una anotación equivalente de propiedad-ref en Hibernate? –

12

Consideraría utilizar las anotaciones de Hibernate. Descubrí que es MUCHO más fácil trabajar con eso que las definiciones xml.

Aquí está el código en formato de anotación:

@Entity 
@Table(name="parent") 
public class Parent 
{ 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    @ManyToOne 
     @JoinColumn(name="child", referencedColumnName = "id") 
    private Child child; 
} 

@Entity 
@Table(name = "child") 
public class Child 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public int id; 

    @Column(name = "code") 
    public String code; 
} 
+0

Esto no es relevante para la pregunta real ¿verdad? –

+6

Está relacionado y personalmente lo encontré muy útil. –

Cuestiones relacionadas