Как сделать двунаправленное сопоставление аннотированного свойства @Any? - PullRequest
5 голосов
/ 09 июля 2010

В этой статье http://www.jroller.com/eyallupu/entry/hibernate_the_any_annotation, а также в этом вопросе Как использовать аннотации, связанные с Hibernate @ Any? , как объяснялась аннотация @Any.Но как я могу получить заимствования для каждого DVD / VHS / BOOK?Как я могу сделать определение отображения на DVD / VHS / BOOK?

Ответы [ 2 ]

5 голосов
/ 09 июля 2010

Я не думаю, это поддерживается и, как указано в документации:

2.4.5.2.@ Any

Аннотация @Any определяет полиморфную ассоциацию с классами из нескольких таблиц.Этот тип отображения всегда требует более одного столбца.Первый столбец содержит тип связанного объекта.Остальные столбцы содержат идентификатор. Невозможно указать ограничение внешнего ключа для такого рода ассоциации, поэтому это, безусловно, не подразумевается как обычный способ отображения (полиморфных) ассоциаций.Вы должны использовать это только в очень особых случаях (например, журналы аудита, данные сеанса пользователя и т. Д.).

Хотя я понимаю, что эта аннотация была введена для сопоставления свойства ассоциации с другимтипы сущностей, у которых нет сущности общего предка, я думаю, что было бы лучше ввести базовый тип, от которого другие сущности наследовали бы для двунаправленных отношений.

См. также

2 голосов
/ 25 мая 2012

Да, проблема с двунаправленными ассоциациями, где одна сторона является полиморфной (отображается с помощью @Any или @ManyToAny), заключается в том, что Hibernate автоматически генерирует недопустимый внешний ключ . Лично я считаю это ошибкой, а не ошибкой использования.

Вы можете обойти это, явно указав внешний ключ, то есть не полагайтесь на Hibernate для его вывода. Предположим, что в примере «Заимствовать <-> DVD / VHS / Book» требуется двунаправленная ассоциация «многие к одному» между Borrow и DVD / VHS / Book («элемент»), а затем вы отображаете ее на Сторона Взять с полиморфным механизмом @Any для предмета, а сторона item с @OneToMany для заимствования.

НО: в последнем свойстве / получателе вы также явно указываете объединяющий столбец для использования, например. "ITEM_ID". Это должно заставить Hibernate использовать только «ITEM_ID», а не (как я видел) ITEM_ID + ITEM_TYPE, который он выводит по умолчанию из определения @Any на другой стороне.

Если у вас нет суперкласса «Item» для DVD / VHS / Book, вы должны будете объявить это в каждом классе, например:

@Entity
class Book {
    ...
    @OneToMany
    @JoinColumn(name="item_id")
    public List<Borrow> getBorrows() {
        return this.borrows;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...