Подтвердить что ты не робот

Java - JPA @Basic и @Embedded аннотации

Я изучаю JPA от этот учебник.

У меня есть некоторые путаницы в понимании следующих аннотаций:

  • @Basic
  • @Embedded

Поля встраиваемого типа по умолчанию являются постоянными, как если бы они были аннотированы с помощью @Embedded.

Если поля встраиваемых типов по умолчанию являются постоянными, то зачем нам нужна аннотация @Embedded

4b9b3361

Ответ 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 и Ссылка на источник