Java - JPA @Basic и @Embedded аннотации
Я изучаю JPA от этот учебник.
У меня есть некоторые путаницы в понимании следующих аннотаций:
Поля встраиваемого типа по умолчанию являются постоянными, как если бы они были аннотированы с помощью @Embedded.
Если поля встраиваемых типов по умолчанию являются постоянными, то зачем нам нужна аннотация @Embedded
Ответы
Ответ 1
Аннотация @Embeddable
позволяет указать класс, экземпляры которого хранятся как неотъемлемая часть объекта-владельца. В этой аннотации нет атрибутов.
@Embeddable
public class EmploymentPeriod {
java.util.Date startDate;
java.util.Date endDate;
...
}
Аннотация @Embedded
используется для указания постоянного поля или свойства объекта, значение которого является экземпляром вложенного класса. По умолчанию определения столбцов, указанные в классе @Embeddable
, относятся к таблице объекта-владельца, но вы можете переопределить их с помощью @AttributeOverride
:
@Embedded
@AttributeOverrides({
@AttributeOverride(name="startDate", [email protected](name="EMP_START")),
@AttributeOverride(name="endDate", [email protected](name="EMP_END"))
})
public EmploymentPeriod getEmploymentPeriod() { ... }
Что касается дополнительной аннотации @Basic
, вы можете использовать ее для настройки типа выборки на LAZY
и настроить сопоставление для запрета пустых значений (для не примитивных типов) с атрибутом optional
.
@Basic(fetch=LAZY)
protected String getName() { return name; }
Вы также можете поместить его в поле или свойство, чтобы явно помечать его как постоянное (для целей документации).
Ответ 2
В ORM-сопоставлении гранулярность вашей объектной модели может быть более тонкой, чем у вашей базы данных.
Например, вы можете иметь запись Person
в своей базе данных, которая может быть дополнительно разложена, чтобы содержать ссылку на объект Address
в вашей модели. Что там, где появляются аннотации @Embedded
и @Embeddable
. Они просто указывают отношение, в котором один Entity
может быть сохранен как часть другого.
Что касается аннотации @Basic
, это простейшая форма отображения, которая по умолчанию применяется к примитивным типам, таким как int и float, и их обертки, а также перечисления. Более подробную информацию можно получить здесь: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#entity-mapping-property
Ответ 3
@Basic
Основная аннотация может применяться к постоянному свойству или переменная экземпляра любого из следующих типов:
Явные примитивные типы Java, обертки примитивных типов, String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp, byte [], Byte [], char [], Character [], перечисления и любой другой тип, который реализует java.io.Serializable.
Использование аннотации Basic необязательно для постоянные поля и свойства этих типов. Если базовый аннотация для такого поля или свойства не указана, значение по умолчанию будут использоваться значения аннотации Basic.
Пример:
@Basic
protected String name;
и
@Basic(fetch=LAZY)
protected String getName() {
return name;
}
@Embedded
Указывает постоянное поле или свойство объекта, значение которого равно экземпляр вложенного класса. Встраиваемый класс должен быть аннотируется как Embeddable.
Пример 1:
@Embedded
@AttributeOverrides({
@AttributeOverride(name="startDate", [email protected]("EMP_START")),
@AttributeOverride(name="endDate", [email protected]("EMP_END"))
})
public EmploymentPeriod getEmploymentPeriod() { ... }
Пример 2:
@Entity
public class Project {
@EmbeddedId ProjectId id;
//other fields
}
@Embeddable
Class ProjectId {
int departmentId;
long projectId;
}
Спецификация сохранения JSR и Ссылка на источник