2009-06-17 6 views
4

Pouvez-vous me donner un exemple d'un mapping Hibernate pour la situation suivante:Hibernate Exemple OneToMany avec compositeKey

  1. table parent (foo) avec une simple clé primaire (foo_id)
  2. table enfant (bar) avec une clé composite constitué par

    a) la clé étrangère à la table parent (foo_id)

    b) clé (item) de type chaîne

  3. Il est l'un des parents à de nombreux enfants
  4. La classe parent aura une liste d'objets enfant
  5. Lorsqu'une classe parent est enregistré, mis à jour, supprimé les modifications en cascade à l'enfant

Répondre

4

Je n'ai pas fait exactement ce que vous demandez, mais cela pourrait vous mettre dans la bonne direction. Je pense que ça devrait marcher. Ce page explique ces annotations plus en détail.

@Entity 
public class Foo { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public Long getId(){ 

    } 
    ... 
    @OneToMany(mappedBy="foo") 
    public Collection<Bar> getBars() { 

    } 


... 
} 


@Entity 
@IdClass(BarPk.class) 
public class Bar implements Serializable { 
    @ManyToOne 
    @JoinColumn(name="foo") 
    @Id 
    public Foo getFoo() { 
     return foo; 
    } 

    @Column(name="key", length=255) 
    @Id 
    public String getKey(){ 

    } 

} 


@Embeddable 
public class BarPk implements Serializable { 
    public Foo getFoo() { 
     return foo; 
    } 
    public void setFoo(Foo foo) { 

    } 
    public String getKey(){ 
    ... 
    } 

    public void setKey(String key){ 
    ... 
    }  

    //you must include equals() and hashcode()  
} 
+0

Merci! Avez-vous un exemple sans annotations? Nous sommes coincés sur 1.4, malheureusement. –

+1

Cette page http://docs.jboss.org/hibernate/stable/core/reference/en/html/mapping.html explique comment faire le mapping avec xml. –

0

Oui, vous devez utiliser le mappage suivant

@Entity public class Parent {

@Id 
private Integer id; 

@CollectionOfElements 
@JoinTable(
    name="Child", 
    [email protected](name="PARENT_ID")) 
@IndexColumn("childIndex") 
private List<Child> childList = new ArrayList<Child>(); 

}

Remarque @CollectionOfElements et IndexColumn est Hibernate annotations spécifiques, non JPA 1.0 spécification. JPA 2.0 les présentera.

@Embeddable public class enfant {

// @Embeddable class does not contains identifiers 
// child class specific property's 

}

Ainsi, le code suivant fonctionne très bien

Parent parent = new Parent(); Parent.getChildList(). Add (new Child())

parent.getChildList(). Parent.getChildList(). Add (new Enfant()); parent.getChildList(). // autre enfant

session.save (parent); // Un parent et deux enfants seront enregistrés

L'inconvénient de ce problème est que l'annotation @CollectionOfElements ne s'applique qu'à la classe @Embeddadble, et non à une classe Entity. Si vous voulez une classe enfant en tant que classe Entity, j'aimerais voir la solution. Il n'est pas possible d'appliquer en même temps les annotations @Entity et @Embeddable à une classe.

Cordialement Arthur Ronald F D Garcia (programmeur Java) Natal/RN - Brésil

Questions connexes