Когда использовать @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 с плоским списком полей.

Другие вопросы по тегам