Whiteship's Note


OneToOne Join Table 맵핑

Hibernate/Chapter 7 : 2008.02.09 10:15


특징

  • 만약 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 속성을 사용하여 설정한다.

'Hibernate > Chapter 7' 카테고리의 다른 글

다형적인 ManyToOne 연관  (0) 2008.02.20
하이버네이트 애노테이션과 XML 설정 사이의 Fetching 기본값 차이  (0) 2008.02.20
맵 맵핑하기  (0) 2008.02.09
Join Table에 컬럼 추가하기  (0) 2008.02.09
ManyToMany 관계 맵핑  (7) 2008.02.09
OneToMany 관계 맵핑  (1) 2008.02.09
Multy-valued entity 연관  (0) 2008.02.09
OneToOne Join Table 맵핑  (0) 2008.02.09
OneToOne 외례키 맵핑  (0) 2008.02.09
주키를 공유하는 맵핑  (0) 2008.02.09
Single-valued entity 연관  (0) 2008.02.09
top


OneToOne 외례키 맵핑

Hibernate/Chapter 7 : 2008.02.09 10:12


특징

  • 주키를 공유하는 것이 아니라, 외례키로 관계를 맺는다.
  • User---->Address 의 관계에서 User는 Source, Address는 Target.
  • Source에서 Target이 한 개씩 맵핑되기 때문에, ManyToOne으로 Unique 속성을 true로 맵핑한다.(XML에서만)
  • 양방향으로 맵핑할 때는 Address---->User로 맵핑도 해줘야 한다.
  • 하이버네이트에 Address의 user가 반대쪽 관계를 나타내는 속성의 inverse라는 것을 표현해준다.

맵핑하기

  • 단뱡향 맵핑
User.java
@OneToOne
@JoinColumn(name="SHIPPING_ADDRESS_ID")
@Cascade( { CascadeType.SAVE_UPDATE })
private Address shippingAddress;
  • Address의 주키 속성은 그냥 일반적인 id로 설정하고 기본 주키 생성기를 사용한다. 커스텀 주키 생성기 사용할 필요 없슴.
  • 양방향 맵핑
Address.java
@OneToOne(mappedBy = "shippingAddress")
private User user;
  • mappedBy를 설정해 주어야 Address에 별도의 외례키 컬럼을 만들지 않는다. 왜? inverse라는 걸 알려줬으니까. inverse? 이건 이미 이 반대 방향의 관계에서 이 둘의 관계에 필요한 속성이 있으니까 불필요한 컬럼(또는 추가적인 SQL)을 만들지 않도록 하이버한테 알려주는 거지.

'Hibernate > Chapter 7' 카테고리의 다른 글

다형적인 ManyToOne 연관  (0) 2008.02.20
하이버네이트 애노테이션과 XML 설정 사이의 Fetching 기본값 차이  (0) 2008.02.20
맵 맵핑하기  (0) 2008.02.09
Join Table에 컬럼 추가하기  (0) 2008.02.09
ManyToMany 관계 맵핑  (7) 2008.02.09
OneToMany 관계 맵핑  (1) 2008.02.09
Multy-valued entity 연관  (0) 2008.02.09
OneToOne Join Table 맵핑  (0) 2008.02.09
OneToOne 외례키 맵핑  (0) 2008.02.09
주키를 공유하는 맵핑  (0) 2008.02.09
Single-valued entity 연관  (0) 2008.02.09
top


주키를 공유하는 맵핑

Hibernate/Chapter 7 : 2008.02.09 10:11


특징

  • 두 테이블에서 같은 주키값을 사용한다.
  • 문제는 A-->B 에서 B가 A의 주키값을 사용하도록 하는 것이다. 주기를 공유하도록 설정해야 한다.

맵핑하기

  • JPA는 공유할 주키 생성기를 지원하는 표준화된 방법이 없다.
  • 하이버네이트는 커스텀 id 생성기를 위한 확장 애노테이션을 제공한다.
User.java
@OneToOne
@PrimaryKeyJoinColumn
@Cascade( { CascadeType.SAVE_UPDATE })
private Address shippingAddress;
  • @PrimaryKeyJoinColumn: JOINE을 이용한 상속구조(Table Per Subclass)에서 하위 타입에서 상위 타입의 주키를 자신의 주키이자 외례키로 설정할 때 사용. 여기(1:1맵핑)서는 참조하는 쪽(User)의 주키를 참조되는 쪽(Address)의 외례키로 사용하겠다는 설정이다.
Address.java
@Id
@GeneratedValue(generator = "addressIdGenerator")
@GenericGenerator(name = "addressIdGenerator", strategy = "foreign", parameters = @Parameter(name = "property", value = "user"))
@Column(name = "ADDRESS_ID")
private Long id;

@OneToOne
private User user;
  • JPA에서는 커스텀 식별자 생성기를 만들 수 없기 때문에, 하이버네이트 애노테이션을 이용해야 한다.
테스트 코드
@Test
public void userAndAddress() throws Exception {
Session session = sessionFactory.openSession();
User user = new User();

Address address = new Address();
// Address의 user 속성은 null이면 안 된다. id를 세팅해 주려고 할 때 identifierGeneration 에러 난다.
address.setUser(user);

user.setShippingAddress(address);
session.save(user);

session.flush();
session.close();
assertNotNull(user.getId());
assertNotNull(user.getShippingAddress().getId());
}
  • Fake Object인가... 저렇게 하지 않으면 에러 발생.

'Hibernate > Chapter 7' 카테고리의 다른 글

다형적인 ManyToOne 연관  (0) 2008.02.20
하이버네이트 애노테이션과 XML 설정 사이의 Fetching 기본값 차이  (0) 2008.02.20
맵 맵핑하기  (0) 2008.02.09
Join Table에 컬럼 추가하기  (0) 2008.02.09
ManyToMany 관계 맵핑  (7) 2008.02.09
OneToMany 관계 맵핑  (1) 2008.02.09
Multy-valued entity 연관  (0) 2008.02.09
OneToOne Join Table 맵핑  (0) 2008.02.09
OneToOne 외례키 맵핑  (0) 2008.02.09
주키를 공유하는 맵핑  (0) 2008.02.09
Single-valued entity 연관  (0) 2008.02.09
top


Single-valued entity 연관

Hibernate/Chapter 7 : 2008.02.09 10:10


  • User에 Component로 맵핑했던 Address를 별도의 테이블로 구분하고 싶을 수 있다. 다른 Entity에서 Address를 공유할 수 있다. 이럴 때 1:1 맵핑이 된다.
  • 주키를 공유하는 맵핑
  • OneToOne 외례키 맵핑
  • Join Table 맵핑

'Hibernate > Chapter 7' 카테고리의 다른 글

다형적인 ManyToOne 연관  (0) 2008.02.20
하이버네이트 애노테이션과 XML 설정 사이의 Fetching 기본값 차이  (0) 2008.02.20
맵 맵핑하기  (0) 2008.02.09
Join Table에 컬럼 추가하기  (0) 2008.02.09
ManyToMany 관계 맵핑  (7) 2008.02.09
OneToMany 관계 맵핑  (1) 2008.02.09
Multy-valued entity 연관  (0) 2008.02.09
OneToOne Join Table 맵핑  (0) 2008.02.09
OneToOne 외례키 맵핑  (0) 2008.02.09
주키를 공유하는 맵핑  (0) 2008.02.09
Single-valued entity 연관  (0) 2008.02.09
top