Как расширить аннотированный класс Hibernate, чтобы указать поле для другого объекта Hibernate? - PullRequest
1 голос
/ 14 июня 2011

Допустим, у меня есть следующая структура класса:

/** Boring bits snipped */
@Entity
@Table(name = "Foo")
public class Foo {
    @JoinColumn(name = "id")
    private Bar bar;
    /** Other flat data goes here */
}

@Entity
@Table(name = "Bar")
public class Bar {
    /** Some data goes here */
}

По причинам Я не собираюсь вдаваться в , у меня есть копии этих таблиц, которые я также хочу отобразить, которые должны появиться в Java, чтобы быть также Foo и Bar объектами , Самое важное, что при работе с копируемыми объектами отношения между таблицами должны быть между скопированными таблицами.

Какой самый правильный способ сделать это?

Полагаю, я могу возможно сделать что-то вроде этого:

@Entity
@Table(name = "OtherFoo")
public class OtherFoo extends Foo {
    @JoinColumn(name = "id")
    private OtherBar bar;
}

@Entity
@Table(name = "OtherBar")
public class OtherBar extends Bar {
}

Но это правильный способ сделать это?

1 Ответ

2 голосов
/ 14 июня 2011

Вы близки, но вы не можете просто наследовать от другой сущности и изменять таблицу таким образом.Наследование сущностей должно соответствовать одной из предоставленных моделей наследования.Это может быть для вашего случая использования так же просто, как добавление @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) к суперклассу.Есть некоторые ограничения, если у вас есть более сложные сопоставления с другими классами.Поскольку он не сможет определить, в какой таблице находится отображение на основе суперкласса, он не может соединиться через него.А сопоставления с суперклассом потребуют каждый раз проверять обе таблицы.Конечно, вам также необходимо генерировать уникальные идентификаторы для всех таблиц в иерархии.Вы можете рассмотреть возможность использования абстрактного суперкласса и иметь обе конкретные сущности как листовые классы.Тогда, по крайней мере, вы всегда можете работать только с одной таблицей, когда знаете, какая это таблица.

В качестве альтернативы вы можете объявить ваши сопоставления столбцов в @MappedSuperclass, и тогда каждый подкласс может быть сущностью с табличным отображением.Это может сработать лучше, если это устаревшие данные и у вас нет уникальных идентификаторов в таблицах «обычный» и «копировать».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...