2012-05-11 5 views
0

최대 절전 모드에 문제가 있습니다. 자연 복합 기본 키가있는 테이블에 매핑 된 엔터티가 있습니다. 기본 키는 필수 코드와 날짜 또는 기간 ID (선택 사항)로 구성되어 있으므로 date와 period_id는 상호 배타적입니다.Hibernate : 합성 자연 기본 키의 선택적 속성

<composite-id name="myEntity" class="myEntity"> 
     <key-property name="code" column="bookcode" /> 
     <key-property name="period" column="PRD_ID" /> 
     <key-property name="pDate" column="PNL_DT"/> 
    </composite-id> 

그러나 날짜가 널 (null)이 아닌 myEntity에 쿼리를 수행하고, 기간이 null myEntity 개체를 채우는 데 실패 내가 (예, 아직 우리에 대한 주석)처럼되지 내 HBM에 매핑. 왜 실패했는지는 알 수 없지만, 기간에 대한 NULL 값이 반환 된 후 최대 절전 모드가 반환 된 특성을 로깅하는 것을 멈출 수 있습니다.

org.hibernate.type.NullableType.nullSafeSet:151 - binding '1157' to parameter: 4 
org.hibernate.type.NullableType.nullSafeGet:193 - returning '1157' as column: LVE1_69_ 
org.hibernate.type.NullableType.nullSafeGet:187 - returning null as column: PRD2_69_ 
END OF LOGGING 

PeriodId 키 속성을 제거하면 문제가 발생하고 myEntity는 성공적으로 채워집니다.

org.hibernate.type.NullableType.nullSafeSet:151 - binding '1156' to parameter: 4 
org.hibernate.type.NullableType.nullSafeGet:193 - returning '1156' as column: LVE1_69_ 
org.hibernate.type.NullableType.nullSafeGet:193 - returning '2012-04-06 00:00:00' as column: PNL2_69_ 
org.hibernate.type.NullableType.nullSafeGet:193 - returning '1156' as column: LVE1_69_ 
LOTS MORE RETURNING lines. 

키 속성에 not-null = "false"속성이 있다고 의심되지만 문서에서 찾을 수 없습니다.

답변

1

id는 기본적으로 null이 아닌 데이터베이스의 기본 키에 해당하기 때문에 Hibernate는 동일하게 간주합니다. 코드가 고유하다면 ID로 선언하고 다른 2는 일반적인 다 대일로 그대로 두십시오

+0

코드가 고유하지 않습니다. period_id 또는 날짜의 조합은 고유합니다. 데이터베이스의 유효한 고유 제한 조건 . 따라서 composite_id는 null이 아니며 하나의 선택적 (Null 가능) 속성으로 구성됩니다. –

+1

하지만 NHibernate의 id와 같은 유효한 기본 키가 아닙니다. 또한 null이있는 열에 대한 고유 한 제약 조건이 null이 제거 될 때까지 비활성화 된 postgres에 한 번 문제가 발생했습니다. – Firo

+0

반품 주셔서 감사합니다. 선택적 속성이있는 복합 ID가 유효한 기본 키인지 여부는 확실하지 않습니다. 이 경우 레코드가 어디에서도 참조되지 않으므로 기본 키는 실제로 필요하지 않습니다. BTW 나는 대리 자동 증가 PK를 추가하여 문제를 해결했지만 여전히 당신의 데이터 모델을 오염으로 볼 수 있습니다. –