2009-11-04 3 views
0

나는 매우 특별한 문제로 내 자신을 두드렸다. OpenJPA (KODO 4.1)를 사용하면 둘 이상의 열을 판별 자 열로 사용할 수 있습니까?영구적 인 서브 클래스를위한 여러 개의 discriminator 컬럼

내 문제는 내가이 유사 (나는 물론 수정할 수있는 능력을 제한) 테이블 구조를 가지고있다 : 매체 보트와 자동차 구별 비싼 bettwen 차별 것 비싼 것

Table VEHICLE  EXPENSIVE_CAR CHEAP_CAR  EXPENSIVE_BOAT CHEAP_BOAT 
--------------------------------------------------------------------------------- 
     HORSE_POWER LUXURY_ACC  CLASIFICATION SIZE    SIZE 
     MEDIUM  EXTRAS       TV_SIZE 
     IS_EXPENSIVE CLASIFICATION 

또는 싸게.

OpenJPA에서 제공하는 상속 기능을 사용하여이 작업을 수행 할 수있는 방법이 있습니까 (최대 절전 모드에서는 discriminator 수식을 사용할 수 있지만 기본 JPA 공급자에서 전환하지 않으려 고합니다). 내가 그것을

덕분에 (내가 공급 업체 독립을 선호하더라도) 그럴듯한 해결책이 될 수 있다고 직감이 있기 때문에 당신이 좋은 것입니다는 OpenJPA에서 사용자 지정 discriminator strategies에 대해 말해 줄 수있는 경우 보너스로

많이

답변

0

뒤로 시작합시다.

판별 자 전략은 계층의 관련 엔터티를 구분하는 열의 유형을 정의합니다. JPA 1.x에서는 문자열 (기본값), char 및 정수가 될 수 있습니다. 예 : 기본값으로 하나의 테이블 상속 전략은

import javax.persistence.DiscriminatorType; 
import javax.persistence.DiscriminatorValue; 
import javax.persistence.Entity; 

@Entity 
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 5) 
@DiscriminatorValue("FOO") 
public class Foo { ... } 

@Entity 
@DiscriminatorValue("BAR") 
public class Bar extends Foo { ... } 

@Entity 
@DiscriminatorValue("BAZ") 
public class Baz extends Baz { ... } 

당신이 사용하는 경우이며,이 설정은 '계층 구조에있는 모든 이들 엔티티는 의미, 부모 클래스의 데이터베이스 테이블에 매핑되는 것을 의미합니다 DB에 Foo, Bar 및 Baz 클래스의 모든 특성과 문자열 유형 (대부분 varchar-variant, 길이 5)을 가진 TYPE이라는 ​​식별자 열을 추가하고 각 엔터티 형식에 대해 각각의 discriminator 값이 지속되면 자동으로 삽입됩니다.

Bar 또는 Baz 엔터티를 JPQL로 찾을 때 JPA는 FOO 테이블에서 엔티티를 찾을 수 있습니다 (상위 엔티티의 테이블이기 때문에). 그리고 판별 자 열의 내용에 의존하여 JPA 공급자는 Bar 또는 Baz 개체를 생성하는 것을 차별 할 수 있습니다.

discriminator 유형을 INTEGER 또는 CHAR로 설정하면 1, 2, 3 또는 "A", "B", "C"등의 값을 각각 쓸 수 있습니다.

지금 OpenJPA 질문입니다.

AFAIK OpenJPA를 사용하여 여러 개의 값을 쉽게 지정할 수는 없지만 좀 더 복잡한 엔티티 계층 구조를 만들 수 있으므로 스키마를 수정할 수 있으면 Vehicle 엔티티, 자동차, 보트와 ExpensiveBoat 및 ExpensiveCar 모두.

스키마를 고수해야한다면 JPA가 제공하는 판별 자 기능을 사용할 수 없다는 것을 의미하는 합류 또는 테이블 당 클래스 상속 전략을 사용하고 있다고 생각합니다 (그러나 FIXME).

+0

스키마에 대한 액세스 권한이없는 경우 joined 또는 table_per_class 전략을 사용해야하는 것은 아니지만 종종 IRL을 이해하는 유일한 전략입니다. – Monachus

+0

사실, 당신 말이 맞습니다. –

관련 문제