2012-05-07 2 views
1

Я новичок в JPA. У меня есть суперкласс «Человек» и два подкласса «Учитель и ученик». Большую часть времени Лицо - всего лишь Учитель или Студент, но иногда один Человек - и Студент, и Учитель, и мне нужно упорствовать. Кто-нибудь знает, как я могу сопоставить наложение UML-наследования в JPA? Является ли это возможным?JPA Наложение UML наложения

Спасибо заранее!

ответ

0

Я думаю, вы должны думать об этом по-другому, вместо того, чтобы использовать «есть А», что позволит вам думать о наследовании, вы могли бы подумать, что это человек, имеющий более чем одну роль, поэтому, если вы так думаете , вы могли бы решить эту проблему с агрегацией, как следующего

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

И что оставляет вас красивое изменение:

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

с помощью следующих классов

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

public class TeacherProfile extends Profile { 
    //teacher data 
} 

public class StudentProfile extends Profile { 
    //student data 
} 

И это может решить вашу проблему элегантно, не нарушая вашу идею наследования.

Я могу объяснить, почему ваша оригинальная идея, даже если это возможно в реляционной базе данных, невозможно в мире объектов, подумайте о получении Person by ID, если у вас был тот же человек с двумя «ролями», тогда какой экземпляр вернется в спячку? Студент ошибся, и Учитель ошибся. Это было бы возможно, если бы java был языком множественного наследования, у которого есть свои проблемы :)

Надеюсь, я дал вам понять.

+0

Спасибо, Хуан! Но как я могу это сделать в JPA? –

+0

просто добавьте аннотацию @OneToMany в набор профилей, и все готово. –

+0

Чистые решения, на мой взгляд. Другим решением будет создание интерфейсов Student и Teacher в Java и реализация всех свойств в Person и двух булевых флагов для преподавателей и студентов. В этом случае у вас не будет проблем с JPA ... но это не «хорошее» решение - Хуанс лучше. – Christian

Смежные вопросы