2012-02-05 2 views
5

프리 플리 티브쪽으로 이어지는 경향이있는이 question을 보았고 포장 자로 이어지는 경향이있는 coderanch에서이 것을 보았습니다. 둘 다 약간 늙었습니다.JPA2.0에서 Primitives 또는 래퍼를 사용해야합니까?

표준적인 우수 사례를 알고 싶다는 특별한 필요는 없습니다.

웹상의 예제도 혼합되어 있습니다. 예컨대 이런 식으로 가서 몇 가지 : 래퍼와

@Id 
@Column(name = "CUSTOMER_ID") 
public long customerId; 

기타 : 둘 사이의 차이는 Null 허용 여부가

@Id 
@Column(name = "CUSTOMER_ID") 
public Long customerId; 

답변

6

입니다. 원시 형은 null는 될 수 없지만, "Wrapped"형은 null이 될 수 있습니다.

ID 값이 null인지 여부에 관계없이 객체가 데이터베이스에 저장 /로드되었는지 여부를 알 수 있으므로 래핑 유형을 사용하는 것을 선호합니다.

"모범 사례"가 여기 있다고 생각하지 않습니다. 아마도 스타일 문제일까요?

+1

나는 널 (NULL) "savedness"표시등이 매우 좋은 방법이다라고 말하고 싶지만. (ID 또는 버전/타임 스탬프 열이든간에) – millimoose

+0

+1, null 값은 중요한 감시 신호입니다. 같은 이유로 모든 엔티티 객체에 래퍼를 사용합니다. – Perception

+0

그래서 ID 버전이나 타임 스탬프에는 래퍼가 선호되지만 다른 사람에게는 그렇지 않습니다. –

1

프리미티브를 사용하는 경우 값이 데이터베이스에 없더라도 항상 기본 값,이 경우 0L을 유지합니다. 그리고 랩퍼 오브젝트를 사용하면 값이 데이터베이스에 없거나 엔티티가 아직 보존되지 않은 경우 널 값을 갖게됩니다.

+0

IIRC, 기본 멤버에 매핑 한 열의 null 값을 사용하여 데이터베이스에서 개체를 읽으려고하면 런타임 오류가 발생합니다. 따라서 단순히 기본값을 삽입하는 것 이상입니다. – Bill

0

대답은 @Column 주석의 nullable 요소에 포함되어 있다고 생각합니다. wrapped 프리미티브보다 nullable이 될 수 있다면 괜찮습니다. 그러나 nullable = false 열 (ID가)에서는 기본 문자가 더 좋습니다. null을 int/long으로 형변환 할 수 없으므로 추가 검사를 받게됩니다.

3

Hibernate는 당신을 권장합니다

우리는 당신이 영속 클래스들에 대해 일관되게 명명 된 identifier 프로퍼티 을 선언하고 당신이 널 (NULL)을 사용하는 것이 (즉, 비 원시)를 입력하는 것이 좋습니다. Hibernate가 그것들을 표현하기 위해 같은 Hibernate 타입을 사용하기 때문에보기의 최대 절전 모드 관점에서

+3

이것은 식별자 속성에만 해당되며 일반적인 권장 사항은 아닙니다. – joecoder

0

more, 그것은 아무것도 변경되지 않습니다.

그러나 Bytecode Ninja가 지적한 것처럼 기본 null 0의 기본 값을 할당 된 0과 구별 할 수는 없지만 null과 가능한 모호성은 없습니다 (null id는 항상 새 엔터티를 의미 함) 그래서 nullable 래퍼 유형을 사용하는 것을 선호합니다.

그리고 이것은 최대 절전 모드 권장 사항입니다. 참조 문서에서 :

4.1.2. 식별자 속성 제공 (선택 사항)

Cat에는 id라는 속성이 있습니다. 이 등록 정보는 데이터베이스 테이블의 기본 키 열에 매핑됩니다. 이 속성은 무엇이라도 호출되었을 수 있으며 그 유형은 기본 유형, 기본 "래퍼"유형, java.lang.String 또는 java.util.Date 일 수 있습니다. 레거시 데이터베이스 테이블에 복합 키가있는 경우 이러한 유형의 속성을 가진 사용자 정의 클래스를 사용할 수 있습니다 (이 장의 뒷부분에있는 복합 식별자 섹션 참조).

identifier 속성은 필수적으로 선택 사항입니다. 그것들을 남겨두고 Hibernate로 하여금 객체 식별자를 내부적으로 추적하도록 할 수있다. 그러나 우리는 이것을 권장하지 않습니다.

실제로, 일부 기능 만 식별자 속성을 선언하는 클래스 사용할 :

분리 개체 (캐스케이드 업데이트 또는 캐스케이드 병합) 용

이적 재접속 - 10.11 절 "트랜 지속성" Session.saveOrUpdate () Session.merge() 영속 클래스에 일관성있는 식별자 속성을 선언하고 nullable (즉, 프리미티브가 아닌) 유형을 사용하는 것이 좋습니다.

그리고 실제로 내 기본 클래스에서이를 활용 :

@MappedSuperclass 
public class BaseEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private Long id; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Transient 
    public boolean isNew() { 
     return (this.id == null); 
    } 
} 

여기에서 자세한 내용을 확인하시기 바랍니다 : https://stackoverflow.com/posts/3537407/edit

관련 문제