2012-05-07 4 views
1

Je suis nouveau dans JPA. J'ai une superclasse appelée Person et deux sous-classes Teacher et Student. La plupart du temps une personne est juste un enseignant ou un élève, mais parfois une personne est à la fois des étudiants et des enseignants et je dois persister il. Est-ce que quelqu'un sait comment je peux mapper cet héritage UML chevauchant dans JPA? C'est possible?héritage UML JPA overlaping

Merci à l'avance!

Répondre

0

Je pense que vous devriez le penser d'une autre manière, au lieu d'utiliser le "est A" qui vous laisserait penser à l'héritage, vous pourriez le penser comme une personne ayant plus d'un rôle, donc si vous le pensez de cette façon , vous pouvez le résoudre avec l'agrégation, comme le

public class Person { 
    private TeacherProfile teacherProfile; 
    private StudentProfile studentProfile; 
} 

Et que vous laisse suite à une belle changement:

public class Person { 
    private Set<Profile> profiles; 
} 

avec les classes suivantes

public abstract class Profile { 
    private String name; 
    //common data 
} 

public class TeacherProfile extends Profile { 
    //teacher data 
} 

public class StudentProfile extends Profile { 
    //student data 
} 

Et cela peut résoudre votre problème avec élégance sans casser votre idée d'héritage.

Je peux expliquer pourquoi votre idée originale, même s'il est possible sur une base de données relationnelle, n'est pas possible sous le monde des objets, pensez à obtenir la Personne par ID, si vous avez la même personne avec les deux rôles quelle instance hibernerait renvoyer? Un étudiant aurait tort et un enseignant aurait tort. Ce serait possible que si java était un langage de l'héritage multiple, qui a ses propres problèmes :)

espoir je l'ai fait clair pour vous.

+0

Merci Juan! Mais comment puis-je faire cela dans JPA ?? –

+0

juste ajouter l'annotation @OneToMany sur les profils définis et vous avez terminé. –

+0

Une solution propre à mon avis. Une autre solution consisterait à créer des interfaces Étudiant et Enseignant en Java et à implémenter toutes les propriétés de la personne et deux indicateurs booléens pour l'enseignant et l'élève. Vous n'aurez pas de problèmes avec JPA dans ce cas ... mais ce n'est pas une solution "sympa" - Juans, c'est mieux. – Christian