Entity класс - требования и определение.

Hibernate позволяет определить обычный Java класс, как часть модели реляционной реляционной базы данных, точнее соответствие определенного класса к таблице модели базы данных. Что необходимо определить на уровне Java кода рассмотрим в данном материале.

Для начала, остановимся на основных требованиях JPA спецификации, которые необходимо учитывать при создании Entity класса (выполнение следующих требований позволяет переносить Entity классы под иную реализацию JPA):

  • Класс сущности (Entity класс) должен быть аннотирован аннотацией javax.persistence.Entity (или быть обозначен как таковой в XML-сопоставлении).
  • Класс сущности должен иметь public или protected конструктор без аргументов. Entity класс также может определять дополнительные конструкторы с аргументами.
  • Класс сущности должен иметь свойство (свойства) – уникальный идентификатор, аннотированный аннотацией javax.persistence.Id.
  • Класс сущности должен быть классом верхнего уровня.
  • Перечисление [enum] или интерфейс [interface] не могут быть определены как сущность [Entity].
  • Класс сущности не должен быть определен как – final. Также ни один из методов или постоянных экземпляров переменных класса сущности не могут быть  определены как final.
  • Если экземпляр Entity класса должен использоваться удаленно как отдельный объект, класс сущности должен реализовывать интерфейс Serializable.
  • Entity классы могут быть абстрактными.
  • Entity классы могут расширять обычные Java классы (не-сущности), а также классы сущностей.
  • Обычные Java классы (классы не сущности) также могут расширять Entity классы сущностей.
  • Постоянство состояния объекта Entity класса представлено значениями его переменных. Переменные Entity класса не должны быть доступны извне. Доступ к переменным для клиентов обеспечивается только с помощью методов получения и установки значений (getter/setter methods) или иными бизнес методами, определенными разработчиком.

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

Ниже представлено определение Entity класса, с необходимыми аннотациями:

package info.deskbook.hibernate.examle.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Person implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Id
	private Long id;

	private String lastName;
	
	private String firstName;
	
	private Date birthday;
	
	public Person() {
	}
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getLastName() {
		return lastName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public String getFirstName() {
		return firstName;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}

В приведенном примере, представлен обычный Java класс, описывающий личность человека (Person). Однако ряд отличий превращает его с класс сущности:

  • Аннотация @Entity указывают, что данный класс является Entity классом (сущностью), сопоставленной с одноименной таблицей базы данных.
  • Аннотация @Id определяет свойство класса, выступающего в качестве идентификатора. В базе данных для данной таблице по полю Id будет создан первичный ключ с соответствующим уникальным индексом.

Этих двух аннотаций вполне достаточно, чтобы EJB контейнер определил данный класс, как сущность (Entity - класс).

Аннотирование @Entity, кроме определения класса как сущности, определяет имя атрибута, которое будет использоваться в запросах JPQL (Java Persistence Query Language) —платформенно-независимого объектно-ориентированного языка запросов, являющегося частью спецификации JPA.