Аннотация @AttributeOverride

Аннотация @AttributeOverride используется для переопределения сопоставления атрибутов, унаследованного от сопоставленного суперкласса (класса-предка) или встраиваемого объекта.

Использование наследования при проектировании сущностей (Entity) в проектах Java EE стало хорошей практикой.  Во многих случаях такие решения приводят к положительным результатам и предоставляют ряд преимуществ при разработке приложений.

Однако необходимо взглянуть на возможные проблемы или неудобства связанные с наследованием. Для примера создадим класс BaseEntity, который является предком (суперклассом) для всех сущностей в проекте:

@MappedSuperclass
public class BaseEntity implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Id
	@Column(name="ID")
	private Long id;
	
	public BaseEntity() {
		super();
	}
	
	/* определение методов опущено для краткости */
		
}

Все Entity классы будут создаваться расширяя класс BaseEntity. В классе-предке определен идентификатор – id. Аннотацией @Column идентификатор ассоциирован с полем “ID” будущей таблицы базы данных. Все хорошо. Но если мы хотим, чтобы в таблицах базы данных, имена полей идентификаторов имели иные наименования, допустим для списка валют в таблице базы данных CURRENCY, хотим иметь идентификатор – ID_CURRENCY. В этом случае аннотация @AttributeOverride нам и пригодится. С помощью данной аннотации переопределяем имя поля идентификатора:

@Entity
@Table(name="CURRENCY")
@AttributeOverride(name = "id", column = @Column(name = "ID_CURRENCY")) 
public class Currency extends BaseEntity implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private String name;

	public Currency() {
		super();
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

Обратите внимание на строку @AttributeOverride(name = "id", column = @Column(name = "ID_CURRENCY")). После данной аннотации идентификатор id, определенный в классе-предке будет проассоциирован с полем ID_CURRENCY таблицы CURRENCY (Справочник валют).

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

Замечание. Для множественного переопределения свойств необходимо использовать группирующую аннотацию @AttributeOverrides, которая будет включать все аннотации @AttributeOverride.