Аннотации Java для работы с базой данных

Рассмотрим аннотации, которые используются в стандарте JPA и в различных фреймворках вроде Hibernate.

@Entity javax.persistence.Entity
@Table javax.persistence.Table
@Column javax.persistence.Table
@Id javax.persistence.Id
@GeneratedValue javax.persistence.GeneratedValue
@Version javax.persistence.Version
@OrderBy javax.persistence.OrderBy
@Transient javax.persistence.Transient
@Lob javax.persistence.Lob
@PersistenceContext javax.persistence.PersistenceContext
@Temporal javax.persistence.TemporalType
@Embedded javax.persistence.Embedded
Аннотации для связи ассоциаций
@OneToOne javax.persistence.OneToOne
@ManyToOne javax.persistence.ManyToOne
@OneToMany javax.persistence.OneToMany
@ManyToMany javax.persistence.ManyToMany
@PrimaryKeyJoinColumn javax.persistence.PrimaryKeyJoinColumn
@JoinColumn javax.persistence.PrimaryKeyJoinColumn
@JoinTable javax.persistence.JoinTable
@MapsId javax.persistence.MapsId
Аннотации наследования
@Inheritance javax.persistence.Inheritance
@DiscriminatorColumn javax.persistence.DiscriminatorColumn
@DiscriminatorValue javax.persistence.DiscriminatorValue
Аннотации запросов
@NamedQueries javax.persistence.NamedQueries
@NamedQuery javax.persistence.NamedQuery
@SqlResultSetMapping javax.persistence.SqlResultSetMapping
@EntityResult javax.persistence.EntityResult
Аннотации Hibernate
@Audited org.hibernate.envers.Audited
@NotAudited org.hibernate.envers.NotAudited
@Type org.hibernate.annotations.Type

@Entity — Указывает, что данный бин (класс) является сущностью.

@Table — указывает на имя таблицы, которая будет отображаться в этой сущности.

@Column — указывает на имя колонки, которая отображается в свойство сущности.

@Id — id колонки

@GeneratedValue — указывает, что данное свойство будет создаваться согласно указанной стратегии.

@Version — управление версией в записи сущности. При изменении записи увеличится на 1.

@OrderBy — указание сортировки. В примере множество кошек будет отсортировано по имени по возрастанию.

@Transient — указывает, что свойство не нужно записывать. Значения под этой аннотацией не записываются в базу данных (также не участвуют в сериализации). static и final переменные экземпляра всегда transient.

@Lob — указание на большие объекты.

@PersistenceContext — указывает на зависимость EntityManager в контейнере

@Temporal — применяется к полям или свойствам с типом java.util.Date и java.util.Calendar. Например, если в БД время сохраняется как sql.Date, то чтобы использовать дату из java.util.Date указываем эту аннотацию.

@Embeddable и @Embedded («встроенный») — Определяет класс, экземпляры которого хранятся как неотъемлемая часть исходного объекта. Каждый из @Embedded экземпляров сопоставляется с таблицей базы данных сущности.

Аннотации для ассоциаций: один к одному, один ко многим, многие ко многим и др.

@OneToOne —  указывает на связь между таблицами «один к одному».

  • orphanRemoval — позволяет удалять объекты сироты. При удалении родительского объекта удаляется и дочерний.
    @OneToMany(mappedBy=»customer», orphanRemoval=»true»)
  • mappedBy — обратная сторона связи сущности. Поле под этим атрибутом не сохраняется как часть исходной сущности в базе данных, но будет доступна по запросу. (см. ниже @JoinColumn)
  • cascade = CascadeType.ALL — означает, что операция, например, записи должна распространяться и на дочерние таблицы.

В этом примере контакт содержит лишь ссылку на таблицу с детальной информацией. Детали контакта будут доступны по запросу к таблице contactDetail.

@PrimaryKeyJoinColumn — главный ключ для ассоциированной сущности с таким же ключом

@JoinColumn  — применяется когда внешний ключ находится в одной из сущностей. Может применяться с обеих сторон взаимосвязи. Но рекомендуется применять в сущности, которая является владельцем физической информации (обычно сторона @ManyToOne). ManyToOne (часто) является стороной-владельцем в двунаправленных связях и таким образом противоположная сторона использует @OneToMany(mappedBy=..).

Пример (более распространенное использование mappedBy и JoinColumn)

Менее распространенный вариант (нужно еще менять свойства insertable и updatable). Такое решение менее оптимизировано, но будет работать:

@JoinTable — указывает на связь с таблицей

@ManyToOne — указывает на связь многие к одному.

@OneToMany — указывает на связь один ко многим. Применяется с другой стороны от сущности с @ManyToOne

@ManyToMany — связь многие ко многим.

@MapsId — связывает одну колонку с другой. Работает с @Id и @EmbeddedId.

@Inheritance — наследование. Для понимания аннотации необходимо обратиться к руководству Hibernate User Guide (Inheritance)
@DiscriminatorColumn
@DiscriminatorValue

Аннотации запросов

@NamedQueries — внутри указывается список именованных запросов.
@NamedQuery — имя именованного запроса и сам запрос.
@SqlResultSetMapping — куда будет собран результат.
@EntityResult — указание сущности в которой будет сконструирован результат.

Аннотации Hibernate

@Audited — Включает аудит сущности (отслеживание версий).
@NotAudited — указывает, что изменения этого свойства отслеживать не нужно. По умолчанию Hibernate пытается отслеживать изменения в ассоциациях.
@Type указывает на тип свойства

TopLink JPA Annotation Oracle

TopLink JPA Annotation Reference

Share Button
44
90138 Total Views 26 Views Today

Добавить комментарий