2014-04-09 2 views
0

이것은 특정 senario 질문보다는 일반적인 '이해'질문에 가깝습니다.두 테이블의 JPA 매핑 및 조인트 사용 가능시기

JPA가 테이블을 함께 매핑하는 방식을 살펴 보았으며 여기서 여러 가지 방식으로 작동하는 두 가지 예제를 발견했습니다.

하나는 전화 개체의 집합 STUDENT_ID

다른를하여 학생에 STUDENT_PHONE 가입 @JoinTable 사용이 StockDailyRecord의 설정을 가지고 있지만 단지 mappedby 주식을 사용하는 것과 stock_detail 테이블 오브젝트의 @PrimaryKeyJoinColumn 주석이 .

어떤 방법이 선호되는 방식인지 그리고 왜 그 이유가 무엇인지 이해하기 만하면됩니까?

방법 1 :

@OneToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "STUDENT_PHONE", joinColumns = { @JoinColumn(name = "STUDENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "PHONE_ID") }) 
public Set<Phone> getStudentPhoneNumbers() { 
    return this.studentPhoneNumbers; 
} 

방법 2 :

@Table(name = "stock", catalog = "mkyongdb", uniqueConstraints = { 
    @UniqueConstraint(columnNames = "STOCK_NAME"), 
    @UniqueConstraint(columnNames = "STOCK_CODE") }) 


@OneToMany(fetch = FetchType.LAZY, mappedBy = "stock") 
public Set<StockDailyRecord> getStockDailyRecords() { 
    return this.stockDailyRecords; 
} 


@Table(name = "stock_detail", catalog = "mkyongdb") 

@OneToOne(fetch = FetchType.LAZY) 
@PrimaryKeyJoinColumn 
public Stock getStock() { 
    return this.stock; 
} 

답변

1

방법 # 2 :

그것은 OneToMany 관계를 구축하기 위해 여분의 열을 이용한다. 이 열은 다른 테이블의 외래 키 열입니다. 관계 을 구축하기 전에 데이터베이스에을 추가해야하는 경우이 외래 키 열은 nullable으로 정의되어야합니다. 이는 효율성을 떨어 뜨리고 정규화 된 스키마를 제공 할 수 없습니다.

방법 # 1 :

그것은 세 번째 테이블을 사용하여 관계형 데이터베이스에 데이터를 저장하는 효율적인 방법입니다 및 정규화 된 스키마를 제공합니다. 따라서 가능한 경우 관계를 구축하기 전에 데이터가 존재해야하는 경우이 접근법을 사용하는 것이 좋습니다.

+0

감사합니다. 따라서 방법 1은 학생 -> 학생 _ 전화 <- 전화입니까? 방법 # 2는 STOCK-> STOCK_DETAIL (fk stock_id)입니까? 방법 1은 ManyToMany에 더 이상 가입하지 않습니까? – Casper

+0

예. ManyToOne과 OneToMany에는 Method # 1과 # 2를 모두 사용할 수 있습니다. 그러나 방법 # 1은 ManyToMany에 대한 유일한 옵션입니다. – Jay