Когда использовать @Embedded и @Embeddable?
В Java можно аннотировать класс как @Embeddable
или установить свойство как @Embedded
, Образец кода:
@Embeddable
class A{
...
}
class B{
...
}
@Entity
class Foo {
A a;
@Embedded B b;
}
Когда предпочитать @Embedded
а также @Embeddable
?
4 ответа
Есть два основных использования @Embedded
/@Embeddable
насколько я знаю:
Первое и самое важное: разделение больших классов сущностей. В мире баз данных большая таблица (одна со многими столбцами) - это хорошо. Разрушение такой таблицы может даже усугубить ситуацию и столкнуться с принципами проектирования баз данных. В Java (или объектно-ориентированных языках в целом), с другой стороны, большой класс code smell
, Здесь мы хотели бы разделить классы, включая классы сущностей, на более мелкие единицы. @Embedded
/@Embeddable
позволяет нам легко сделать это без необходимости разбивать таблицу базы данных.
Во-вторых, он позволяет повторно использовать общие отображения между сущностями. Скажем, у каждой таблицы есть простое отслеживание ревизии, с двумя столбцами, содержащими имя пользователя, который изменил строку, и время, когда это произошло. Затем можно сделать @Embeddable
объект, охватывающий эти строки, а затем повторно использовать его во всех объектах, встраивая его (вместо того, чтобы повторять переменные, соответствующие этим столбцам в каждом объекте).
Если у нас есть Персона и Адрес, которые являются двумя POJO, Вы не захотите создавать другую таблицу для Адреса, но захотите встроить адрес в таблицу персон. Таким образом, Address добавляет значение к объекту Person, но не имеет никакого смысла индивидуально. В этом случае мы можем пойти с:
@Embeddable
public class Address{
}
@Entity
public class Person
{
@Embedded
private Address address;
}
Вы бы использовали @Embeddable и @Embedded вместе. Вы помечаете свой класс как @Embeddable, что означает, что этот класс не будет существовать в БД как отдельная таблица. Теперь, когда вы используете @Embedded на самом поле.
Слово "встраиваемый" и "внедренный" дает вам большую подсказку.
Embeddable = Этот класс может быть встроен в класс Embedded = Этот класс теперь будет встроен в ваш класс как поле.
Я думаю, если вы аннотируете класс как @Embeddable
вам не нужно аннотировать поле как @Embedded
. Кроме того, если вы аннотируете класс как@Embeddable
и вы хотите использовать его как первичный ключ, вы можете использовать @Id
только, но если он не аннотирован как @Embeddable
, вы должны использовать @EmbeddedId
на поле для работы в качестве первичного ключа.
Это оба используются в спящем режиме с аннотацией:
@Embeddable использовать для составного первичного ключа.
@ Встроенная сущность объединяется с родительской сущностью и обрабатывается так же, как если бы они были объявлены там постоянно. Иногда у вас есть огромная таблица с несколькими столбцами (особенно с устаревшими базами данных). Однако некоторые столбцы логически связаны друг с другом (например, улица, город и номер телефона в таблице CUSTOMER). Если вы не хотите создавать объект со всеми полями, вы создаете встроенный объект Address. Таким образом, вы логически группируете адресные столбцы в объект вместо того, чтобы иметь одинаково огромный POJO с плоским списком полей.