Несколько связей ManyToMany с использованием «mappedBy» с членом класса Super - PullRequest
4 голосов
/ 20 июля 2011

Я занимаюсь разработкой приложения с использованием 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>();

1 Ответ

2 голосов
/ 20 июля 2011

Добавьте аннотацию: @Where (clause = "activityType = 'Todo'")

Но это спящая аннотация, а не JPA

...