29. Расскажите про аннотации @JoinColumn, @JoinColumns и @JoinTable. Где и для чего они используются?
Unknown@JoinColumn
Аннотация @JoinColumn используется для указания столбца FOREIGN KEY, используемого при установлении связей между сущностями или коллекциями. Мы помним, что только сущность-владелец связи может иметь внешние ключи от другой сущности (владеемой). Однако, мы можем указать аннотацию @JoinColumn как во владеющей таблице, так и во владеемой, но столбец с внешними ключами всё равно появится во владеющей таблице. Особенности использования:
@OneToOne: означает, что появится столбец addressId в таблице сущности-владельца связи Office, который будет содержать внешний ключ, ссылающийся на первичный ключ владеемой сущности Address.
@Entity
public class Office {
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "addressId")
private Address address;
}
@OneToMany/@ManyToOne: в данном случае мы можем использовать параметр mappedBy для того, чтобы столбец с внешними ключами находился на владеющей стороне ManyToOne - то есть в таблице Email:
@Entity
public class Employee {
@Id
private Long id;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "employee")
private List<Email> emails;
}
@Entity
public class Email {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "employee_id")
private Employee employee;
}
В приведенном выше примере таблица Email (владелец связи) имеет столбец employee_id, в котором хранится значение идентификатора и внешний ключ к таблице Employee.

Если бы мы не указали mappedBy, то была бы создана сводная (третья) таблица с первичными ключами из двух основных таблиц.
@JoinColumns
Аннотация @JoinColumns используется для группировки нескольких аннотаций @JoinColumn, которые используются при установлении связей между сущностями или коллекциями, у которых составной первичный ключ и требуется несколько колонок для указания внешнего ключа.
В каждой аннотации @JoinColumn должны быть указаны элементы name и referencedColumnName:
@ManyToOne
@JoinColumns({
@JoinColumn(name="ADDR_ID", referencedColumnName="ID"),
@JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP")
})
public Address getAddress() { return address; }
@JoinTable
Аннотация @JoinTable используется для указания связывающей (сводной, третьей) таблицы между двумя другими таблицами.
Предыдущий вопрос: 28. Для чего нужна аннотация @ID? Какие GeneratedValue вы знаете?
Следующий вопрос: 30. Для чего нужны аннотации @OrderBy и @OrderColumn, чем они отличаются друг от друга?
Все вопросы по теме: список
Все темы: список
Вопросы/замечания/предложения/нашли ошибку: напишите мне