시스템에 리소스 키/값 쌍을 저장하는 테이블이 있습니다. 값을 저장하는 두 개의 열이 있습니다. 더 작은 값을위한 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")
그것이 내가 할 노력하고있어 이해하지 않지만, 의미가이되어야한다고한다을 그것을하는 방법. 그렇다면 판별 자 필드를 속성으로 어떻게 노출합니까?
감사합니다.
우리는 그렇게 할 수도 있지만이 두 클래스를 사용하는 클래스는 변경해야합니다. 나는 그것이 우리가하려고하는 것보다 더 깔끔한 해결책이지만, 훨씬 더 침해 적이라는 데 동의한다. 이것은 기존의 모든 코드이므로 한 가지 방법으로 작성하는 것이 아닙니다. –
우리는 한 클래스에 리팩토링을했다. 우리의 의심을 확인해 주셔서 감사합니다. –