Я думаю, вы должны думать об этом по-другому, вместо того, чтобы использовать «есть А», что позволит вам думать о наследовании, вы могли бы подумать, что это человек, имеющий более чем одну роль, поэтому, если вы так думаете , вы могли бы решить эту проблему с агрегацией, как следующего
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 был языком множественного наследования, у которого есть свои проблемы :)
Надеюсь, я дал вам понять.
Спасибо, Хуан! Но как я могу это сделать в JPA? –
просто добавьте аннотацию @OneToMany в набор профилей, и все готово. –
Чистые решения, на мой взгляд. Другим решением будет создание интерфейсов Student и Teacher в Java и реализация всех свойств в Person и двух булевых флагов для преподавателей и студентов. В этом случае у вас не будет проблем с JPA ... но это не «хорошее» решение - Хуанс лучше. – Christian