2011-12-28 2 views
5

내가 이런 User 실체가 있다고 가정 : 내가 원하지 않는hbm.xml에 매핑 된 속성을 일시적으로 사용할 수 있습니까?

class User { 
    private String login; 
    transient private String hashedPassword; 
} 

을에 지금까지 클라이언트에 hashedPassword를 전송, 그래서 나는이 과도합니다.

이 클래스는 Hibernate에 의해 매핑되고, 두 필드는 모두 hbm.xml에 매핑됩니다.

이 구현은 안전하고 정확합니까? 최대 절전 모드로 정확히 hashedPassword을 데이터베이스에 저장하고, 데이터베이스의 개체에로드하고, 복제 된 2 차 수준 캐시 및 로컬 세션 캐시 등에서 유지할 것입니까?

즉, 최대 절전 모드 또는 2 차 레벨 캐시 transient을 존중합니까 아니면 완전히 무시합니까?

EDIT : 이미 방정식의 특정 측면을 포함하지 않는 두 가지 대답이 있습니다. 주석을 전혀 사용하지 않고 있으며 XML 매핑 만 hbm.xml에 있습니다. 이 Java-transient 필드는 hbm.xml에 OR 매핑됩니다.

답변

3

Hibernate는 사용자가 가지고있는 다른 주석에 관계없이 transient 키워드가있는 필드를 유지하지 않는 것처럼 보입니다.

별도의 @Transient 주석이 지속성을위한 비 transient 필드를 무시 최대 절전 모드를 지시 할 수 있지만, 나는 그것이 transient 지속 필드가 최대 절전 모드를 갖는 반대를 할 수 있다고 생각하지 않습니다. 여기

유사 토론 : 위의를 통해

JPA - using annotations in a model

Annotation @Basic to transient variables

가장 관련 인용, 사양은 JPA 2.0에서 "매핑 주석 필드 나있는 속성에 적용되어서는 안 transient 또는 @Transient . "

+0

감사합니다. 그러나 필드가 hbm.xml에 매핑되었다고 특별히 언급했습니다. 나는 주석을 모두 고소하지 않을 것이다. –

+0

Hibernate는이 경우에 실제로 속성을 매핑합니까? 어노테이션과 hbm.xml이 동일하게 동작한다는 가정하에 있었지만 어쩌면 그렇지 않을 수도 있습니다. 'transient'가 속성이 직렬화되지 않도록 보장 할 것이기 때문에 당신의 질문은 완전히 Hibernate의 행동에 관한 것입니까? – wrschneider

7

최대 절전 모드에 의해 매핑되지 않은/일시적인 속성이 저장되지 않습니다.

Hibernate는 표준 Java Transient Modifier의 중요성을 이해합니다. 그러나 @Transient annotation을 사용하여 속성을 일시적으로 주석 처리 할 수도 있습니다. 그렇게 선택하면 ... 또는 매핑 파일에서 필드를 완전히 벗어나게하십시오.

당신의 경우에는 맵핑되지 않은 필드를 무시하여 최대 절전 모드에서 단순히 "올바른 작업을 수행해야"하는 특별한 일을 할 필요가 없을 것입니다.

그래서 : 교훈은 여기에서 배운 -

1 hbm.xml를 사용하는 경우) 매핑되지 않은 속성이 최대 절전 모드로 저장되지 않습니다 - 효과적으로 과도이다.

하면 사용 POJO를

2) 최대 절전 모드 "@Transient"주석 변수 절약 무시합니다 :

@Transient 
int ignored=0; 

3) 최대 절전 모드 것 또한 표준 "과도"수정과 저장 변수를 무시 :

private transient int ignored =0; 

자세한 설명은 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/을 참조하십시오.

+0

감사합니다. 그러나 필드가 hbm.xml에 매핑되었다고 특별히 언급했습니다. 나는 주석을 모두 고소하지 않을 것이다. –

+0

예 thats true - POJO 어노테이션은 부적절합니다. 나는 당신의 질문에 대답하기 위해 총알을 더했습니다. 어쨌든 - 그것의 단순한, 다만 당신의지도에서 변수를 남겨 두십시오 - 및 최대 절전 모드는 다른 방법을 볼 것입니다. 하이버 네이트의 객체 맵은 맵핑되지 않은 변수를 포함하지 않으므로 저장이나 캐싱은 수행되지 않습니다. – jayunit100

+0

제이, 고맙습니다.하지만 제 입장은 꽤 정반대입니다. hbm.xml로 매핑 된 일시적인 POJO 필드를 유지하는 것이 항상 안전한지, 제 2의 lv 캐시와 그 외의 것들인지 묻습니다. –

0

내가 생각하기에 - Hibernate는 단지 매핑 기술이다. 필드를 TRANSIENT로 표시하면 java에 의해 유지되지 않습니다. 그리고 그 상태가 지속되지 않는 이유는 L2 캐시 등에서 그것을 최대 절전 모드로 유지해야하는 이유입니까? 그래서 hibernate는 hbm 파일의 transient 필드를 매핑하더라도 아무런 문제가 없어야합니다.

관련 문제