2012-01-11 4 views
2

시스템에 리소스 키/값 쌍을 저장하는 테이블이 있습니다. 값을 저장하는 두 개의 열이 있습니다. 더 작은 값을위한 VARCHAR 컬럼과 더 큰 값을위한 CLOB. 자바 측면에서, 그들은 두 개의 클래스하는 StandardResourceBundleValue 또는 LargeResourceBundleValue 및 판별 열 중 하나에 인스턴스화는 하나 개의 테이블에서 그들을 구별하는 데 사용됩니다식별자 열을 hbm 파일의 등록 정보로 표시

<discriminator type="string"> 
    <column name="RESOURCE_TYPE" length="20" index="XIE1CPD_RESOURCE_BUNDLE_L_V"/> 
</discriminator> 
... 
<subclass name="StandardResourceBundleValue" discriminator-value="STANDARD"> 
    <property name="messageValue" type="string" column="STD_MSG_VALUE" length="400"/> 
</subclass> 
<subclass name="LargeResourceBundleValue" discriminator-value="LARGE"> 
    <property name="messageValue" type="materialized_clob" column="LARGE_MSG_VALUE"/> 
</subclass> 

여기에서 재미있는 부분 : 만약의 값 키가 작게 시작되고 (StandardResourceBundleValue로 유지 된 후) 값이 VARCHAR보다 큰 값으로 변경되면 StandardResourceBundleValue로 변환하는 방법이 필요합니다. 이 상황에서 발생하는 코드는 표준 위반 원본 삭제 값을 삭제하고 LargeResourceBundleValue를 만들 수 없습니다. 이는 제약 조건 위반을 유발하기 때문입니다.

우리가하고자하는 것은 그 discriminator 컬럼에 대한 프로퍼티를 정의하는 것입니다. 그래서 기본 클래스는 객체의 값을 변경하는 메소드를 가질 수 있습니다. 다시 영속화 될 때 CLOB에 값을 저장합니다.

<property name="resourceType" type="string"> 
    <column name="RESOURCE_TYPE"/> 
</property>  

나는 테이블을 구축하려고, 나는 다음과 같은 오류 얻을 : 분명히

Repeated column in mapping for entity: com.foo.resourcebundle.LargeResourceBundleValue column: RESOURCE_TYPE (should be mapped with insert="false" update="false")

그것이 내가 할 노력하고있어 이해하지 않지만, 의미가이되어야한다고한다을 그것을하는 방법. 그렇다면 판별 자 필드를 속성으로 어떻게 노출합니까?

감사합니다.

답변

2

당신은 그렇게 할 수 없습니다. 객체에는 유형이 있으며 한 유형에서 다른 유형으로 전환 할 수 없습니다. 그것이 Java가 작동하는 방법입니다.

여기 엔 두 가지 유형의 엔티티가 없어야한다고 생각합니다. 판별자를 기본 열거 형 열로 저장하고이 열거 형 값에 따라 varchar 또는 clob 열에 속성 값을 저장/가져 오지 않는 이유는 무엇입니까? 모든 것이 투명하게 객체에 캡슐화되고 호출자에 대해서도 모든 것이 더 쉬워 질 것입니다. enum 필드는 공개 될 수 없습니다. 이 값을 사용하여 getMessageValue() (해당 열에서 값을 가져옴)을 구현하고 setMessageValue()이 호출 될 때 새 값의 길이에 따라이 값을 변경합니다.

+0

우리는 그렇게 할 수도 있지만이 두 클래스를 사용하는 클래스는 변경해야합니다. 나는 그것이 우리가하려고하는 것보다 더 깔끔한 해결책이지만, 훨씬 더 침해 적이라는 데 동의한다. 이것은 기존의 모든 코드이므로 한 가지 방법으로 작성하는 것이 아닙니다. –

+0

우리는 한 클래스에 리팩토링을했다. 우리의 의심을 확인해 주셔서 감사합니다. –

관련 문제