Как мне расширить аннотированный класс hibernate, чтобы указать поле на другой объект hibernate?

#java #hibernate

#java #спящий режим

Вопрос:

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

 /** 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. Обычно я бы создал мини-проект и протестировал это, но в данный момент я не в состоянии это сделать : (

Ответ №1:

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

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

Комментарии:

1. Похоже, что a @MappedSuperClass с двумя подклассами — это правильный путь, спасибо 🙂