2017-10-11 4 views
0

J'ai 3 entités qui peuvent avoir une relation les unes avec les autres. Donc, une bonne étape pour résoudre ce problème est d'utiliser une autre table pour stocker les 3 ID des 3 entités. Disons que les entités sont X, Y et Z.Relation ternaire Hibernate et table additionnelle

@Entity 
public class XYZ { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @ManyToOne 
    @JoinColumn(name = "X_ID") 
    private X x; 

    @ManyToOne 
    @JoinColumn(name = "Y_ID") 
    private Y y ; 

    @ManyToOne 
    @JoinColumn(name = "Z_ID") 
    private Z z; 

    public XYZ(){ 

    } 


} 

Entités X, Y et Z ont leurs propres attributs et propre clé primaire. J'ai quelques questions.

1) Devrais-je ajouter @OneToMany aux entités X, Y et Z sur l'attribut privé XYZ xyz; ? Ou n'est-ce pas nécessaire lorsque nous voulons seulement trouver la relation avec l'aide de la table XYZ.

2) Dans l'entité XZY j'ai des getters et setters normaux pour les entités X, Y et Z. Je donne l'entité entière. Hibernate va-t-il automatiquement picorer les clés primaires de X, Y et Z dans l'entité XYZ?

Dernière question 3) Disons que je supprime l'objet X qui est utilisé dans l'entité XYZ, est-ce que hibernate va automatiquement supprimer l'enregistrement dans l'entité XYZ? Ou dois-je ajouter des informations supplémentaires.

Désolé pour ces questions, mais Hibernate est très nouveau pour moi.

Répondre

0
  1. Speciying @OneToMany de l'autre côté (sur X, Y et Z entités) est pas nécessaire, sauf si vous voulez faire de votre relation bidirectionnelle.
  2. Vous avez déjà défini les annotations @JoinColumn: X_ID, Y_ID, Z_ID qui sont les colonnes de clé externe extraites des clés primaires de vos entités X, Y et Z, respectivement.
  3. Si vous souhaitez supprimer une cascade, de telle sorte que lorsque vous supprimez X, l'entité enfant XYZ soit également supprimée, c'est le moment où vous devez rendre votre relation bidirectionnelle. Vous devez spécifier un mappage @OneToMany sur votre entité X et ajouter un attribut cascade.

Exemple:

@OneToMany(mappedBy="x", cascade=CascadeType.REMOVE) 
Set<XYZ> xyzSet;