java - 크기 - 자바 테이블 구현




엔터티 ID로 상자 형 대 프리미티브 유형 (4)

글쎄, 우리는 비 - 프리미티브를 사용하고 우리는 그것에 대한 강한 이유가 있습니다. 예를 들어, int/Integer 중 하나 인 필드는 절대적인 비즈니스 가치가 zero 완벽하게 유효합니다. 예를 들어 부채 장을 생각해보십시오 - 부채가 없다는 의미에서 필드가 zero 이면 정상입니다.

문제는 프리미티브를 사용하면 0이 기본값이되므로 실수로 setDebt 를 통해 설정하는 것을 잊어 버릴 수 있으므로 결코 의도하지 않은 값으로 데이터베이스에 도달 할 있습니다. 이러한 이유 때문에 우리는 Integer 를 몇 가지 유효성 검사와 함께 사용합니다. 예를 들어 null이되어서는 안됩니다. 그러나 적절한 유효성 검사를 추가하는 것을 잊어 버리더라도 코드는 잠재적으로 NullPointerException (테스트가 바람직 함)로 손상 될 수 있으며 데이터베이스의 일관되지 않은 값보다 많은 예외가 좋습니다.

JPA (Hibernate 구현) 엔티티 ID로 사용하는 것이 더 나은 유형 : 박스형 ( Integer ) 또는 박스형 (예 : int )?

친구는 Boxed 타입을 사용해야한다고 말했다. 왜냐하면 프로그램에서 새로운 엔티티를 생성 할 때, Hibernate는 id가 null 이고 데이터베이스에 새로운 행을 생성해야한다는 것을 이해하기 때문이다 (id가 null 이 아닌 경우 Hibernate는 데이터베이스의 기존 행).

하지만 내 엔티티의 ID는 int 이고 오류없이 잘 작동하며 기본 인스턴스 변수의 기본값은 0 입니다. 따라서 그는 최대 절전 모드가 0 을 특별하다고 간주하고 오브젝트가 새로운 것임을 가정합니다.


엔티티 ID에 대한 프리미티브 (예 : int)와 해당 래퍼 (예 : Integer)에는 차이가 없습니다. 둘 다 JPA 스펙에 따라 유효합니다. JPA 제공자는 엔티티의 상태 및 라이프 사이클을 추적 할만큼 충분히 똑똑합니다. 엔티티 ID가 0 (기본 유형) 또는 NULL (랩퍼 유형) 인 경우 JPA 제공자는 ID 생성기가 구성된 경우 엔티티에 대한 ID를 생성합니다. id가 자동 생성되면 0은 유효한 엔티티 ID로 간주되지 않습니다.

Cmobilecom JPA 두 가지 경우를 모두 테스트하여 동일하게 잘 작동합니다. 물론 성능 차이는 발견 할 수 없습니다.

면책 조항 : 저는 Cmobilecom JPA 의 개발자입니다. Java 및 Android 용 경량 JPA 구현입니다.


우리는 이것을 다음과 같이 생각할 수 있습니다 :

우리가 값 x :: Int를 가졌을 때 , 'x'는 계산 될 때 Int가 리턴되거나 bottom (undefined)이 될 계산입니다.

프로그램이 실행되고 x 가 계산되면 실제 Int (하단이 아님)로 평가한다고 가정합니다. 그런 다음 x가 평가 될 때마다 계산 전체를 다시 실행하는 대신 이전에 계산 한 값만 가져 오려고합니다.

우리가 이것을하기 위해 무엇을하기 전에 단순히 계산 된 값을 반환하는 썽크로 x를 계산하는 썽크 (계산)로 대체하는 것입니다.

문제는 x를 나중에 가져올 때마다 값을 반환하는 (사소한) 코드에이 포인터를 따라야한다는 것입니다. 이 값이 자주 필요하면 값이 비쌉니다.

상자 안의 값을 입력하십시오. unboxed 값은 단지 저수준 값이며 썽크 안에 싸여 있지 않습니다. 이것은 프로그램이 반드시 죽지 않고는 정의 될 수 없다는 점에서 엄격하다는 의미입니다.


제네릭에서 Boxed Type을 사용할 수있는 유연성을 제공하기 때문에 엔터티 모델에서 Boxed Type을 선호합니다. 예를 들어, 여기 엔티티 모델은 id에 대해 Serializable으로 확장되는 유형만 가질 수 있습니다. 그것은 나중에 우리가 기본 키에 대한 다양한 작업을 수행 할 수있는 서비스 계층에서 유용 할 것입니다.

public interface BaseEntity<E extends Serializable> extends Serializable {
  E getId();
}

엔티티 모델은 다음과 같을 수 있습니다.

@Entity
public class PhoneNumber implements BaseEntity<Long> {
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "PHONE_NUMBER_ID")
  private Long id;




orm