2012-11-08 3 views
2

JPA (정확하게는 EclipseLink)와 매핑하려고하는 기존 MS SQL Server 2000 데이터베이스가 있습니다.@DiscriminatorColumn의 NULL 값 처리

나도 '연락처'또는 '자산'이 될 수있는 텍스트 필드 "KEY1"이있는 테이블 "CONTACT1"가, 내가 사용하고 있습니다 :

@Table(name = "CONTACT1") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "KEY1") 
public abstract class Record { 

이 (두 개의 서로 다른 클래스에 매핑 연락처 및 자산).

@Entity 
@DiscriminatorValue(value = "Contact") 
public class Contact extends Record {...} 

@Entity 
@DiscriminatorValue(value = "Asset") 
public class Asset extends Record {...} 

불행하게도 나는 몇 가지를 발견하거나 기록이 누락 및 추가 분석을 한 후 나는 약간의 접촉 기록을 NULL로 "KEY1"필드가 설정되어 깨달았다.

문제를 해결하기 위해 업데이트 쿼리를 실행할 수는 있지만 피할 수있는 방법은 무엇입니까? 'NULL'값을 Contact 클래스에 매핑하는 방법이 있습니까?

JPA에서 레코드를 사전 필터링하여 JPA가 필드가 NULL이 아니지만 '연락처'가 기록되어 있다고 생각하게하는 메커니즘이 있습니까?

답변

0

업데이트를 실행하고 데이터베이스에 null 값이있는 행에 올바른 값을 할당해야합니다. 또한 데이터베이스의 열 정의를 수정하고 기본값을 설정하여 나중에 null을 방지하도록 조언합니다.

또는 @DiscriminatorColumn을 사용하지 마십시오. 내 경험상, 그것은 가치가있는 것보다 더 많은 복잡성과 버그를 추가하는 경향이 있습니다.

+0

불행히도, 내가 말했듯이, 그것은 레거시 데이터베이스이며, 거의 제어 할 수 없기 때문에 읽기 전용으로 액세스합니다. 이 업데이트를 수행하면 끝없는 재검사가 반복됩니다. 그러나 @DiscriminatorColumn에 대한 경험에 대해 더 알고 싶습니다. 대신에 무엇을 권하고 싶습니까? – thedayofcondor

+0

가능한 한 깨끗한 엔티티로 사용할 것을 권장합니다.이 엔티티는 테이블에 일대일 매핑합니다. 이는 기존의 유연하지 않은 데이터 모델로 제한 될 때 특히 그렇습니다. '@ Inheritance'는 단순한 엔티티와 속성을 사용하여 얻을 수없는 것을 제공하지 않습니다. 관계형 데이터 구조를 (다형성 상속 구조) 아닌 것으로 무언가에 넣으 려 고 시도한 적이 있습니다. – pap

+0

전적으로 동의합니다 -하지만이 데이터베이스를 볼 수 있어야합니다 ... 문자열을 보유하는 필드와 동일한 테이블의 대문자 버전을 보유하는 다른 필드가 있습니다. 기본 키를 제외하고 다른 모든 필드는 "해석"되어야합니다. 예를 들어 필드는 '연락처'일 경우 전화 번호이거나 '자산'인 경우 일련 번호입니다. 테이블 상속을 사용하면이 두 가지 경우를 올바르게 처리 할 수 ​​있습니다. 그러나 네트워크 설정에 클라이언트가 잘못 설정되어 있어야합니다. NULLs - 테이블을 업데이트하더라도 널 (NULL)이 다시 발생하기 시작합니다. – thedayofcondor