Переопределение equals() и hashCode() в Entity классе.

Для примера реализации Entity класса с использованием аннотаций в предыдущем материале была реализована сущность Person. Основным определением Entity класса является аннотация javax.persistence.Entity. По умолчанию имя объекта реляционной базы данных (таблицы) представляет собой имя самой сущности. Entity класс моделирует таблицу базы данных а поле аннотированное @Id - идентификатор, однозначно идентифицирующий каждую запись в таблице.

В таблице базы данных проблема с идентификацией каждой отдельной записи решена наличием поля-идентификатора и уникального первичного ключа (Primay Key) по данному полу. На уровне Java кода, также можно идентифицировать экземпляр Entity класса по свойству сущности, аннотированное @Id. Для сравнения объектов в Java используется метод equals(). Для корректного сравнения и идентификации объектов в Hibernate необходимо переопределить два метода в Entity классе на основании его идентификатора. Для примера дополним класс Person:

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() {
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	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;
	}
}

Теперь при сравнении двух объектов, реализующих класс Person, даже если эти два человека полные однофамильцы и родились в один день, будет получен корректный результат. Они будут являться совершенно разными сущностными.