Стратегия наследования в Hibernate: создание сущности абстрактной и замена на подклассы - PullRequest
1 голос
/ 09 июля 2010

У меня уже есть база данных и отображение спящего режима.Есть центральная таблица и соответствующая сущность (PersistentObject).Многие другие таблицы и сущности ссылаются на PersistentObject через @ManyToOne или @OneToOne отображение.

Теперь я хотел бы сделать текущий PersistentObject абстрактным и ввести два подкласса Sub1Object и Sub2Object, которые наследуются от PeristentObject.

Я не могу изменить таблицу, в которой хранится PersistentObject, иначе возможно добавление новых таблиц и т. Д.Таблица содержит достаточно информации, чтобы я мог использовать, например, @DiscriminatorColumn для разделения строк Sub1Object и Sub2Object, если это необходимо.

Возможно ли внести это изменение, чтобы мои текущие запросы HQL по-прежнему работали без изменений?У меня много запросов, таких как from PersistentObject where foo = ? и from OtherEntity other where other.persistentObject = ?.Я хотел бы, чтобы эти запросы начали возвращать конкретные подклассы вместо суперкласса.Я не хочу кодировать отдельные запросы для Sub1Object и Sub2Object.

Возможно ли это вообще?Какую стратегию наследования мне следует использовать?

Ответы [ 2 ]

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

Я не могу изменить таблицу, в которой хранится PersistentObject, иначе возможно добавление новых таблиц и т. Д. Таблица содержит достаточно информации, чтобы я мог использовать, например, @DiscriminatorColumn для разделения Sub1Object и Sub2Object строк, если это необходимо.

Вы МОЖЕТЕ использовать стратегию наследования JOINED (с дискриминатором или без него). Для высшего класса:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DISC")
public abstract PersistentObject {

    @Id @GeneratedValue
    private Long id;

    ...
}

А например:

@Entity
public class Sub1Object extends PersistentObject {
    ...
}

Это не изменит существующую таблицу.

Можно ли внести это изменение, чтобы мои текущие HQL-запросы по-прежнему работали без изменений? У меня много запросов, таких как from PersistentObject where foo = ? и from OtherEntity other where other.persistentObject = ?. Мне бы хотелось, чтобы эти запросы начали возвращать конкретные подклассы вместо суперкласса.

Они будут работать и возвращать экземпляры всех постоянных классов, расширяющих этот класс.

1 голос
/ 09 июля 2010

Вы должны использовать стратегию таблица-на-класс-иерархию, потому что вы хотите использовать столбец дискриминатора :). Как по мне, hibernate должен работать с тем, что вы описали, без каких-либо проблем.Достаточно отобразить подклассы как классы, поддерживающие hiberante, и обеспечить надлежащий дискриминатор.

Только предупреждаем, что иногда директива instanceof не будет работать, потому что вы получите прокси-объект, но вы можете использовать Hibernate.getClass (Obj...) проверить.

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