2011-10-05 4 views
0

은 아래의 예를 고려 과일, 오렌지와 사과JPA 한 여러 테이블 사이에서 공유 기본 키와 하나의 관계에

ID가 과일 테이블에 생성 및 기본 키 여기

ID는 오렌지와 사과 (공유 기본 키) 예에 따라서

에 대한 기본 키도 과일의 ID가 1, 2, 3, 4, 5이면 시나리오는 1, 2는 오렌지, 3, 4는 애플, 5는 다시 오렌지입니다.

그래서 오렌지색 테이블은 id 1, 애플 테이블 ID 3을해야합니다 2,5 동안 4

=================================== 
Fruit 
=================================== 
id  | shape 
=================================== 
    1  | round 
    2  | round 
    3  | oblong 
    4  | oblong 
    5  | round 
=================================== 


=================================== 
Orange 
=================================== 
id  | color | taste 
=================================== 
    1  | orange | sour 
    2  | orange | sour 
    5  | orange | sour 
=================================== 


=================================== 
Apple 
=================================== 
id  | density | weight 
=================================== 
    1  | hard  | 200 
    2  | hard  | 220 
    5  | hard  | 230 
=================================== 

문제 : 만 JPA 주석 으로도 relationshipd을 캡처 엔티티 클래스를 만드는 방법 (나는 generatedValue 주석을 최대 절전 모드 사용하지 않음).

순수 JPA로 이러한 주석이 가능하면 나를 향해 안내해주십시오.

+0

당신이하고 싶은 것은 상속 (Orange는 Fruit and Apple -> Fruit)입니다. 이 옵션을 이미 평가 했습니까? –

+0

이것은 단지 가상의 예입니다. 아니. 상속 관계는 없습니다. 더 비슷해 직원 <-> 주소 관계. 각 직원은 하나의 주소를 가지며 각 주소는 한 명의 직원에게만 매핑됩니다. 직원과 주소 모두에 대한 기본 키가 공유됩니다. Employee_Id (Employee의 기본 키)는 Foreign Key로서의 Address의 기본 키입니다. – Nik

답변

0

동일한 열에 매핑 개의 자바 필드 (ID 및 결합)을 강제로 시험한다.

예를 들어

,

class Orange { 

    @Id 
    @Column(name="id") 
    long id; 


    @OneToOne 
    @JoinColumn(name="id") 
    Fruit fruit; 

    public Orange(Fruit fruit) { 
     this.fruit = fruit; 
     this.id = fruit.id; 
    } 

    protected Orange() { } // default constructor required by JPA 
} 

하지만 난 JPA 공급자가 동작하는 방법을 모른다.

2

사례가 "일반화 전문화"라고하는 디자인 패턴의 인스턴스 또는 간략히 Gen- 스펙과 유사합니다. 데이터베이스 테이블을 사용하여 gen-spec을 모델링하는 방법에 대한 질문은 항상 SO에서 올 수 있습니다.

Java와 같은 OOPL에서 gen-spec을 모델링하는 경우 하위 클래스 상속 기능을 사용하여 세부 사항을 처리 할 수 ​​있습니다. 일반화 된 객체를 처리하도록 클래스를 정의한 다음 특수 객체의 각 유형에 대해 하나씩 하위 클래스의 모음을 정의하면됩니다. 각 서브 클래스는 일반화 된 클래스를 확장합니다. 쉽고 간단합니다.

불행히도 관계형 데이터 모델에는 하위 클래스 상속 기능이 내장되어 있지 않으며 SQL 데이터베이스 시스템은 이러한 지식을 제공하지 않습니다. 하지만 너는 운이 좋지 않아. 테이블을 디자인하여 OOP의 클래스 구조와 유사한 방식으로 gen-spec을 모델링 할 수 있습니다. 그런 다음 새 항목이 일반화 된 클래스에 추가되면 고유 한 상속 메커니즘을 구현해야합니다. 세부 사항은 다음과 같습니다.

클래스 구조는 매우 간단합니다. gen 클래스 용 테이블 하나와 각 spec 하위 클래스 용 테이블 하나가 있습니다. Martin Fowler의 웹 사이트에서 멋진 그림을 볼 수 있습니다. Class Table Inheritance. 이 다이어그램에서 Cricketer는 서브 클래스와 수퍼 클래스입니다. 어떤 속성이 어떤 테이블에 들어갈 지 선택해야합니다. 다이어그램은 각 테이블에 하나의 샘플 속성을 표시합니다.

까다로운 세부 사항은이 테이블에 기본 키를 정의하는 방법입니다. gen 클래스 테이블은 일반적인 방법으로 기본 키를 가져옵니다 (이 테이블이 Cricketers와 같은 또 다른 일반화의 전문화가 아니라면). 대부분의 디자이너는 기본 키에 "Id"와 같은 표준 이름을 부여합니다. Autonumber 기능을 사용하여 Id 필드를 채 웁니다. 사양 클래스 테이블에 "Id"라는 기본 키가 있지만 자동 번호 기능이 사용되지 않습니다.대신 각 서브 클래스 테이블의 기본 키는 일반화 된 테이블의 기본 키를 참조하도록 제한됩니다. 이렇게하면 특수화 된 각 기본 키가 외래 키와 기본 키가됩니다. Cricketers의 경우 Id 필드는 Players의 Id 필드를 참조하지만 Bowlers의 Id 필드는 Cricketers의 Id 필드를 참조합니다.

이제 새 항목을 추가 할 때 참조 무결성을 유지해야합니다.
먼저 gen 테이블에 새 행을 삽입하여 기본 키를 제외한 모든 속성에 대한 데이터를 제공하십시오. autonumber 메커니즘은 고유 기본 키를 생성합니다. 그런 다음 기본 키를 포함하여 모든 속성에 대한 데이터를 포함하여 적절한 스펙 테이블에 새 행을 삽입합니다. 사용하는 기본 키는 방금 생성 된 새로운 기본 키의 복사본입니다. 이 기본 키의 전파는 "가난한 사람의 상속"이라고 할 수 있습니다.

이제 모든 일반화 된 데이터와 하나의 하위 클래스의 모든 특수 데이터를 함께 사용하려면 두 테이블을 공통 키를 통해 조인해야합니다. 문제의 하위 클래스와 관련이없는 모든 데이터는 조인에서 제외됩니다. 매끄럽고 쉽고 빠릅니다.

gen-spec 패턴을 구현하는 SQL 테이블 디자인은 약간 까다 롭습니다. 데이터베이스 디자인 자습서는 종종이 주제를 더욱 돋보이게합니다. 그러나 그것은 실제로 반복적으로 나타난다.

"일반화 전문화 관계형 모델링"에서 웹을 검색하면이를 수행하는 방법을 설명하는 몇 가지 유용한 기사를 찾을 수 있습니다. 이 포럼에서이 주제가 몇 번이나 나왔습니다.

이 기사에서는 일반적으로 모든 일반화 된 데이터를 캡처하기 위해 단일 테이블을 디자인하고 해당 하위 클래스에 특정한 모든 데이터를 포함 할 각 하위 클래스에 대해 하나의 특수 테이블을 만드는 방법을 보여줍니다. 흥미로운 부분은 서브 클래스 테이블에 대한 기본 키를 포함합니다. 하위 클래스 기본 키를 채우는 데 DBMS의 자 동 번호 기능을 사용하지 않습니다. 대신 일반화 된 테이블에 대해 얻은 기본 키 값을 적절한 하위 클래스 테이블에 전파하도록 응용 프로그램을 프로그래밍합니다.

이렇게하면 일반화 된 데이터와 특수화 된 데이터가 양방향으로 연관됩니다. 각 특수 하위 클래스에 대한 간단한보기는 일반화 된 특수 데이터를 수집합니다. 일단 손을 뻗어 버리면 간단합니다.