특징

  • 만약 One To One 관계에 있는 두 Entity가 optional 하다면...
  • 이전에 배운 외례키 사용하는 맵핑을 한 다음에, 외례키를 nullable하게 설정하게 할 수 있겠지만...
  • 관계에 추가적인 속성이 추가될 수도 있을테니, 두 Entity의 id를 모두 unique하게 가지고 있고, Join Table을 만들 수도 있다. ORM이 이런 작업을 해줄 수 있다.
  • CaveatEmptor에서는 Shipment와 Item의 관계. Shipment가 Item을 가지고 있을
    수도 있고(물건을 배송 했다.), 없을 수도(배송을 안해서 물건 판 사람이 돈을 못 받을 것이다.) 있다. 배송을 했을 경우에만
    두 관계를 나타내는 테이블에 레코드를 추가해야 할 것이다.

맵핑하기

Shipment.java
@OneToOne
@JoinTable(name = "ITEM_SHIPMENT", joinColumns = @JoinColumn(name = "SHIPMENT_ID"), inverseJoinColumns = @JoinColumn(name = "ITEM_ID"))
private Item auction;
  • Item과 Shipment는 별개의 라이프 사이클을 가지고 있다가, Shipment에 Item을 setting하는 순간, ITEM_SHIPMENT에 레코드가 추가된다.
  • 만약 Join Table에 별도의 속성이 더 필요할 때가 있는데, 그럴 때는 2차 테이블(8장에서 살펴볼 예정)을 사용해서 설정할 수 있다.
@Entity
@Table(name = "SHIPMENT")
@SecondaryTable(name = "SHIPMENT_ITEM")
public class Shipment {

...

@OneToOne
@JoinColumn(table = "SHIPMENT_ITEM", name = "ITEM_ID")
private Item auction;

...
}
  • SecondTable을 정의해 두고, 그 테이블로 옮길 속성을 JoinColumn에서 table 속성을 사용하여 설정한다.