Я занимаюсь разработкой приложения с использованием Hibernate и пытаюсь смоделировать следующий сценарий:
У меня есть класс Activity Abstract, определенный следующим образом:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="activityType")
@Table(name = "BF_ACTIVITY")
public abstract class Activity extends PersistableObject {
@ManyToOne
@JoinColumn(name = "ASSIGNED_TO")
protected Contactable assignedTo;
@ManyToOne
@JoinColumn(name = "RAISED_BY")
protected Contactable raisedBy;
Примечание. Я использую SingleНаследование таблиц (поэтому все реализующие объекты будут использовать одну и ту же таблицу) и установили DiscriminatorColumn.
Теперь у меня есть два объекта, которые расширяют Activity: ToDo и Status:
@Entity
@Table(name = "BF_TODO")
@DiscriminatorValue("Todo")
public class ToDo extends Activity {
...
@Entity
@Table(name = "BF_STATUS")
@DiscriminatorValue("Status")
public class Status extends Activity {
...
Снова обратите внимание, чтодля обеих реализаций я установил DiscriminatorValue.
Наконец, я хочу иметь объект Person, и этот человек может иметь список Status и список ToDo - я также хочу захватить двунаправленные отношения, поэтому я моделирую его, используя конфигурацию mappedBy, но в обоих случаях использую поле «поднятое поле», которое существует в суперклассе «Активность»:
public abstract class Person {
@ManyToMany(mappedBy="raisedBy", targetEntity=Activity.class)
private List<ToDo> todoItems = new ArrayList<ToDo>();
Поскольку я использую mappedBy с переменной-членом «поднялBy»"из суперкласса я также указал targetEntity (иначе он не сможет найти поле в объекте ToDo).
Проблема в том, что когда я пытаюсь вызвать getTodoItems (), он на самом деле просто возвращает все объекты "Activity", связанные с "connectedBy", с текущим человеком.например, он генерирует исключение приведения, потому что он ожидает список задач, но Hibernate также возвращает объекты Status в списке.
Я надеялся, что конфигурации mappedBy вместе с DiscriminatorValue будет достаточно для этой работы - имееткто-нибудь сталкивался с этим или решил?
Спасибо
РЕДАКТИРОВАТЬ
Я только что нашел этот пост:
Может кто-то указать мне вНаправление хорошего @ Где обзор и пример?Могу ли я просто обновить свою личность следующим образом, чтобы использовать @Where со столбцом дискриминатора?
public abstract class Person {
@ManyToMany(mappedBy="raisedBy", targetEntity=Activity.class)
@Where(clause="activityType=Todo")
private List<ToDo> todoItems = new ArrayList<ToDo>();