2013-06-21 5 views
0

У меня есть вопрос относительно спящего режима в отношении наследования. Если у меня есть следующие классы:Hibernate - Список ссылок на суперкласс

@Entity 
@Table(name = "people") 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING) 
public abstract class Person 

@Entity 
@Table(name="teachers") 
@DiscriminatorValue("t") 
public class Teacher extends Person 

@Entity 
@Table(name="students") 
@DiscriminatorValue("s") 
public class Student extends Person 

Тогда то, что я хочу сделать, это обрабатывать все их все в общем в следующем классе:

public class Course { 

... 
@ManyToMany 
private List<Person> students; 
... 

} 

Я хотел бы быть в состоянии обработать список студентов в общем как список вместо списка таким образом, студент или учитель могут быть учеником. Есть ли в любом случае для меня это, и они все еще сохраняются, когда объект Студент/Учитель? Спящий «умный» достаточно, чтобы понять настоящий класс? У спящего режима есть такая возможность?

+0

попробуйте этот список students –

+0

Спасибо, я пробовал это, но потом он бросает: org.hibernate.AnnotationException: Collection не имеет ни общего типа, ни OneToMany.targetEntity(): ... – csyperski

ответ

0

Ваша конфигурация в порядке, Hibernate может справиться с этим. Всякий раз, когда сохраняется экземпляр Student, Hibernate будет генерировать два оператора вставки: один для таблицы people, а другой для таблицы students. Вы можете сделать это, например:

Person p = new Student(); 
session.persist(p); 

Ничего не меняется, если существует ассоциация. Например:

Course c = new Course(); 
c.students = new ArrayList<Person>(); 

Person p = new Student(); 
s.persist(p); 

c.people.add(p); 
session.persist(c); 

PS: Вы можете изменить Course.students к Course.people, потому что список может содержать Teacher экземпляры также.