2009-06-26 6 views
5

Sto provando a creare un livello di sospensione per uno schema di database su cui non ho praticamente alcun controllo. Semplificato, ci sono due tabelle.Hibernate: specificare le colonne in una relazione uno-a-molti

Tabella parent ha due colonne importanti:

  • parent_id, interi, chiave primaria, autoincremented
  • parent_code, corda, chiave unica, generata da una scatola nera da qualche parte (diciamo che questo è un UUID per l'amor di sanità mentale)
  • Inoltre una serie di colonne di dati

Tabella child ha due colonne importanti:

  • child_parent_id, interi, chiave primaria, autoincremented
  • child_parent_code, string, che punta chiave esterna al parent_code valore del livello superiore
  • Inoltre una serie di colonne di dati

Desidero poter chiamare Parent.getChilds() e ottenere una raccolta di oggetti figlio. Ma impostare i file di mapping di Hibernate sembra impossibile. Che cosa sta facendo con i mapping di seguito è la ricerca della tabella child con il valore parent_id (anziché parent_code).

In 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> 

In 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> 

ho passato un'ora studiando attentamente attraverso la mia copia di Java Persistence con Hibernate, ma non riesco a capire come fare ciò che voglio È possibile?

risposta

4

provare qualcosa di simile nel genitore:

<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> 

e questo nel bambino:

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

ho assunto che la proprietà del codice nel genitore è chiamata "codice".

+0

L'attributo property-ref ha funzionato completamente. Grazie! – Plutor

+0

Nessun problema, lieto che abbia aiutato. –

+0

@DavidM Esiste un'annotazione di riferimento di proprietà in ibernazione? –

12

Vorrei prendere in considerazione l'utilizzo delle annotazioni di ibernazione. Li ho trovati molto più semplici da utilizzare con le definizioni xml.

Ecco il codice in formato di annotazione:

@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

Questo non è rilevante per la domanda vera e propria? –

+6

È correlato e personalmente l'ho trovato molto utile. –