Java - JPA @Basic и @Embedded аннотации - PullRequest
33 голосов
/ 05 апреля 2010

Я изучаю JPA из этого урока .

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

  • @Basic
  • @Embedded

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

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

Ответы [ 3 ]

51 голосов
/ 05 апреля 2010

Аннотация @Embeddable позволяет указать класс, экземпляры которого хранятся как внутренняя часть объекта-владельца. Эта аннотация имеет без атрибутов .

@Embeddable
public class EmploymentPeriod {
     java.util.Date startDate;
     java.util.Date endDate;
     ...
}

Аннотация @Embedded используется для указания постоянного поля или свойства объекта, значение которого является экземпляром встраиваемого класса. По умолчанию определения столбцов, указанные в классе @Embeddable, применяются к таблице объекта-владельца, но вы можете переопределить их , используя @AttributeOverride:

@Embedded
@AttributeOverrides({
    @AttributeOverride(name="startDate", column=@Column(name="EMP_START")),
    @AttributeOverride(name="endDate", column=@Column(name="EMP_END"))
})
public EmploymentPeriod getEmploymentPeriod() { ... }

Что касается необязательной аннотации @Basic, вы можете использовать ее, чтобы настроить тип выборки на LAZY и настроить отображение на запрещение пустых значений (для не примитивных типов) с атрибутом optional.

@Basic(fetch=LAZY)
protected String getName() { return name; }

Вы также можете поместить его в поле или свойство, чтобы явно пометить его как постоянный (для целей документации).

12 голосов
/ 05 апреля 2010

В отображении 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 голосов
/ 11 декабря 2012

@ 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 [], enums и любой другой тип, который реализует java.io.Serializable.

Использование базовой аннотации необязательно для постоянные поля и свойства этих типов. Если основной аннотация не указана для такого поля или свойства, по умолчанию применяются значения базовой аннотации.

Пример:

@Basic
protected String name;

и

@Basic(fetch=LAZY)
protected String getName() { 
    return name; 
}

@ Embedded

Определяет постоянное поле или свойство объекта, значение которого экземпляр встраиваемого класса. Встраиваемый класс должен быть аннотируется как Embeddable.

Пример 1:

@Embedded    
@AttributeOverrides({
       @AttributeOverride(name="startDate", column=@Column("EMP_START")),
       @AttributeOverride(name="endDate", column=@Column("EMP_END"))    
})        
public EmploymentPeriod getEmploymentPeriod() { ... }

Пример 2:

@Entity
public class Project {
    @EmbeddedId ProjectId id;
    //other fields
}


@Embeddable
Class ProjectId {
    int departmentId;
    long projectId;
}

Спецификация устойчивости JSR и Ссылка на источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...