29. Расскажите про аннотации @JoinColumn, @JoinColumns и @JoinTable. Где и для чего они используются?

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, чем они отличаются друг от друга?

Все вопросы по теме: список

Все темы: список

Вопросы/замечания/предложения/нашли ошибку: напишите мне


Report Page