Аннотация @ManyToOne

Аннотация @ManyToOne определяет отношение многие к одному — когда множество объект сущности (Entity класса) ссылается на один объект другой сущности.

@ManyToOne является наиболее распространенной ассоциацией, имеющей прямой эквивалент в реляционной базе данных (например, внешний ключ - foreign key), и поэтому он устанавливает связь между дочерним объектом и родителем. Отношение ManyToOne может быть задано однонаправленным. Однако, целевой объект может имеет обратную связь, указанную обратно к исходному объекту. Это будет спецификация отношений OneToMany в целевом объекте. Все отношения в Java являются однонаправленными, поскольку если исходный объект ссылается на целевой объект, нет гарантии, что целевой объект также имеет отношение к исходному объекту. Это отличается от реляционной базы данных, в которой отношения определяются с помощью внешних ключей и запросов, так что обратный запрос всегда существует.

Рассмотрим отношение многие к одному на примере сущностей описывающих страны [Country] и валюты [Currency]:

package info.deskbook.hibernate.mapping.annotation;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="CURRENCY")
public class Currency implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Id
	@Column(name="ID_CURRENCY")
	private Long id;
	
	// полное наименование
	@Column(name="FULL_NAME", length = 100, nullable = false)
	private String fullName;

	// краткое наименование
	@Column(name="SHORT_NAME", length = 30, nullable = false)
	private String shortName;
	
	public Currency() {
	}
	
	/* Определение методов класса
	 * не приводится для краткости */
}
package info.deskbook.hibernate.mapping.annotation;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="COUNTRY")
public class Country implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Id
	@Column(name="ID_COUNTRY")
	private Long id;
	
	// полное наименование
	@Column(name="FULL_NAME", length = 100, nullable = false)
	private String fullName;
	
	// краткое наименование
	@Column(name="SHORT_NAME", length = 30, nullable = false)
	private String shortName;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_CURRENCY")
	private Currency currency;
	
	// Определение дополнительных свойств класса
	// не приводится для краткости
	
	public Country() {
	}

	/* Определение методов класса
	 * не приводится для краткости */
}

Сущность Country содержит свойство типа Currency, аннотированное @ManyToOne, определяющее, что на уровне базы данных множеству записей таблицы COUNTRY будет соответствовать одна запись из таблицы CURRENCY связанной полем ID_CURRENCY. По полю ID_CURRENCY таблицы COUNTRY будет создан внешний ключ (foreign key) к первичному ключу (primary key) таблицы CURRENCY — определено аннотацией @JoinColumn. Опция [fetch = FetchType.LAZY], определяет отложенный способ загрузки свойства [currency] в сущности Country.

В текущем примере приведено однонаправленное отношение многие к одному. Для реализации двунаправленного отношения сущностей Country и Currency необходимо создать связь один ко многим используя аннотацию JPA @OneToMeny на стороне сущности Currency.

Список опций аннотации @ManyToOne
опция тип значение по умолчанию описание
 cascade  CascadeType [] {}  Операции, которые должны быть каскадированы в цель ассоциации. По умолчанию никакие операции не выполняются каскадно.
 fetch FetchType   FetchType.EAGER Определяет как должны загружаться данные ассоциации: отложено или немедленно.
 optional  boolean  true Является ли ассоциация необязательной. Если установлено значение «ложь», должно существовать непустое отношение.
 targetEntity  java.lang.Class void.class Класс сущностей, который является целью ассоциации. По умолчанию используется тип поля или свойства, которое хранит эту ассоциацию.


 

Смотрите также примеры JPA аннотаций при использовании Hibernate: