#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
с двумя подклассами — это правильный путь, спасибо 🙂