Hibernate 4 의 메 인 키 맵 메커니즘

더 읽 기
관계 형 데이터 베 이 스 는 메 인 키 에 의 해 서로 다른 기록 을 구분 하고 메 인 키 는 자연 메 인 키 와 프 록 시 메 인 키 의 구분 이 있다.자연 키: 메 인 키 를 충당 하 는 필드 자체 가 일정한 의 미 를 가지 고 기록 을 구성 하 는 중요 한 구성 부분 을 말한다.프 록 시 메 인 키: 메 인 키 필드 자체 가 업무 적 의 미 를 가지 지 않 고 표지 역할 만 하 는 것 을 말한다. 예 를 들 어 자체 성장 유형의 ID 등 이다.Hibernate 응용 프로그램 에서 프 록 시 키 를 사용 하 는 것 을 적 극 추천 합 니 다.Hibernate 에서 Hibernate 는 대상 식별 자 (OID) 에 의존 하여 서로 다른 지구 화 대상 을 구분한다.대상 식별 자 (OID) 는 Hibernate 에 내 장 된 표지 생 성 기 를 통 해 생 성 할 수 있다.여기 서 토론 하 는 것 은 프 록 시 키, 업무 키 (예 를 들 어 복합 키 등) 입 니 다. 여기 서 토론 하지 않 습 니 다.1. JPA 유 니 버 설 정책 생 성 기 는 Annotation 을 통 해 hibenate 실 체 를 매 핑 합 니 다. Annotation 을 바탕 으로 하 는 hibenate 메 인 키 표 지 는 @ Id 이 고 그 생 성 규칙 은 @ Generated Value 에 의 해 설정 되 었 습 니 다. 이곳 의 @ id 와 @ Generated Value 는 모두 JPA 의 표준 용법 입 니 다. JPA 는 네 가지 표준 용법 을 제공 합 니 다. @ Generated Value 의 소스 코드 에서 뚜렷하게 볼 수 있 습 니 다.

@Target({METHOD,FIELD})  
    @Retention(RUNTIME)  
    public @interface GeneratedValue{  
        GenerationType strategy() default AUTO;  
        String generator() default "";  
    } 

그 중 Generation Type:

public enum GenerationType{  
    TABLE,  
    SEQUENCE,  
    IDENTITY,  
    AUTO 
}

JPA 에서 제공 하 는 네 가지 표준 용법:
TABLE
메 인 키 를 저장 하기 위해 서 특정한 데이터베이스 시트 를 사용 하 십시오.
SEQUENCE
베이스 데이터베이스 시퀀스 에 따라 메 인 키 를 생 성 합 니 다. 조건 은 데이터베이스 지원 시퀀스 입 니 다.
IDENTITY
홈 키 는 데이터베이스 에서 자동 으로 생 성 됩 니 다 (주로 자동 성장 형)
AUTO
마스터 키 는 프로그램 에 의 해 제어 된다.
1、TABLE

@Entity
@Table(name = "TAB_PLAYER")
@TableGenerator(name = "tab-store", table = "AUTO_ID_GENERATOR", 
       pkColumnName = "G_KEY", pkColumnValue = "TAB_PLAYER_PK", 
       valueColumnName = "G_VALUE", allocationSize = 1)
public class Player {
   private Long id;

   @Id
   @GeneratedValue(strategy = GenerationType.TABLE, generator = "tab-store")
   @Column(unique = true, nullable = false) //unique      ,nullable        
   public Long getId() {
      return id;
   }
   ......
}

원본 코드 에서 @ TableGenerator 가 어떻게 정의 되 는 지 보 세 요.

@Target({TYPE, METHOD, FIELD}) 
@Retention(RUNTIME)
public @interface TableGenerator {
  String name();
  String table() default "";
  String catalog() default "";
  String schema() default "";
  String pkColumnName() default "";
  String valueColumnName() default "";
  String pkColumnValue() default "";
  int initialValue() default 0;
  int allocationSize() default 50;
  UniqueConstraint[] uniqueConstraints() default {};
}

그 중에서 속성 설명: name 속성 은 이 표 의 메 인 키 생 성 정책 의 이름 을 표시 합 니 다. @ Generated Value 에 설 치 된 "generator" 값 에 사 용 됩 니 다.table 속성 은 표 생 성 정책 이 지속 되 는 표 이름 을 표시 합 니 다. 예 를 들 어 이 표 는 데이터베이스 에 있 는 'tb generator' 를 사용 합 니 다.catalog 속성 과 schema 는 표 가 있 는 디 렉 터 리 이름 이나 데이터베이스 이름 을 구체 적 으로 지정 합 니 다.pkColumnName 속성의 값 은 지구 화 표 에 있 으 며, 이 메 인 키 는 정책 에 대응 하 는 키 의 이름 을 생 성 합 니 다.예 를 들 어 "tb generator" 에서 "gen name" 을 메 인 키 로 하 는 키 값 valueColumnName 속성의 값 을 지구 화 표 에 표시 합 니 다. 이 메 인 키 는 현재 생 성 된 값 을 만 들 때마다 누적 합 니 다.예 를 들 어 "tb generator" 에서 "gen value" 를 메 인 키 의 값 으로 pkColumnValue 속성의 값 을 지구 화 표 에 표시 하고 이 생 성 정책 에 대응 하 는 메 인 키 를 표시 합 니 다.예 를 들 어 'tb generator' 표 에서 'gen name' 의 값 을 'CUSTOMER PK' 로 한다.initial Value 는 메 인 키 의 초기 인식 값 을 표시 합 니 다. 기본 값 은 0 입 니 다.allocationSize 는 메 인 키 값 이 증가 할 때마다 크기 를 표시 합 니 다. 예 를 들 어 1 로 설정 하면 새 기록 을 만 들 때마다 자동 으로 1 을 추가 하고 기본 값 은 50 입 니 다.UniqueConstraint 는 @ Table 태그 의 용법 과 유사 합 니 다.
2、SEQUENCE

@Entity
@Table(name = "SMS_DEPT")
@SequenceGenerator(name="MyTableGenerator",sequenceName="SEQ_SMS_DEPT")
public class Dept {
   private Long id;

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="MyTableGenerator")
   @Column(unique = true, nullable = false)
   public Long getId() {
      return id;
   }
   ......

소스 코드 에서 @ SequenceGenerator 가 어떻게 정의 되 는 지 보 세 요.

@Target({TYPE, METHOD, FIELD}) 
@Retention(RUNTIME)
public @interface SequenceGenerator {
 String name();
 String sequenceName() default "";
 int initialValue() default 0;
 int allocationSize() default 50;
}

name 속성 은 이 표 의 메 인 키 생 성 정책 의 이름 을 표시 합 니 다. @ Generated Value 에 설 치 된 "generator" 값 에 사 용 됩 니 다.sequenceName 속성 은 생 성 정책 에 사용 할 데이터베이스 시퀀스 이름 을 표시 합 니 다.initial Value 는 메 인 키 의 초기 인식 값 을 표시 합 니 다. 기본 값 은 0 입 니 다.allocationSize 는 메 인 키 값 이 증가 할 때마다 크기 를 표시 합 니 다. 예 를 들 어 1 로 설정 하면 새 기록 을 만 들 때마다 자동 으로 1 을 추가 하고 기본 값 은 50 입 니 다.
3、IDENTITY
데이터베이스 가 SQL SERVER 일 때 IDENTITY 를 사용 할 수 있 습 니 다.

@Entity
@Table(name = "SMS_DEPT")
public class Dept {
   private Long id;

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(unique = true, nullable = false)
   public Long getId() {
      return id;
   }
   ......

4、AUTO
홈 키 를 지정 할 때 홈 키 생 성 정책 을 지정 하지 않 으 면 기본 값 은 AUTO 입 니 다.

@Entity
@Table(name = "SMS_DEPT")
public class Dept {
   private Long id;

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

Hibernate 메 인 키 정책 생 성기
hibenate 는 다양한 메 인 키 생 성 전략 을 제공 합 니 다. JPA 와 유사 합 니 다. 어떤 것 은 hibenate 특유 입 니 다.
생 성기
묘사 하 다.
native
바 텀 데이터 베 이 스 는 자동 으로 OID 를 생 성 하 는 능력 에 대한 지원 에 따라 idenity, sequence 또는 hilo 생 성 기 를 구체 적 으로 선택 하여 OID 를 생 성 합 니 다. 크로스 플랫폼 응용 에 자주 사용 되 고 Oacle 에 대해 Sequence 방식 을 사용 하 며 MySQL 과 SQL Server 에 대해 idenity (자체 키 생 성 메커니즘 증가) 를 사용 합 니 다. native 는 메 인 키 의 생 성 작업 을 데이터베이스 에 맡 기 는 것 입 니 다. hibenate 는 상관 하지 않 습 니 다.(자주 사용)
uuid
128 비트 uid 알고리즘 을 사용 하여 메 인 키 를 만 듭 니 다. uid 는 32 비트 16 진수 문자열 로 인 코딩 됩 니 다. 공간 이 넓 습 니 다 (문자열 형식).
hilo
hilo 생 성 정책 을 사용 하여 데이터베이스 에 추가 표를 만 들 려 면 기본 표 이름 은 hibenate unique key 이 고 기본 필드 는 integer 형식 이 며 이름 은 next hi (적 게 사용) 입 니 다.
assigned
데 이 터 를 삽입 할 때 홈 키 는 프로그램 에서 처리 합 니 다 (자주 사용). 이것 은 요소 가 지정 되 지 않 았 을 때의 기본 생 성 정책 입 니 다. JPA 의 AUTO 와 같 습 니 다.
identity
OID 는 MySql 의 auto increment 타 입 메 인 키 와 SQL SERVER 의 idenity 타 입 메 인 키 와 같은 기본 데이터베이스 자체 증가 메 인 키 생 성 메커니즘 에서 생 성 됩 니 다. 이 방법 은 Oracle 에 넣 을 수 없습니다. Oracle 은 자체 증가 필드 를 지원 하지 않 습 니 다.
select
트리거 를 사용 하여 메 인 키 생 성 (초기 데이터베이스 메 인 키 생 성 메커니즘 에 사용 되 며 적 게 사용)
sequence
기본 데이터베이스 의 시퀀스 를 호출 하여 메 인 키 를 만 듭 니 다. 시퀀스 이름 을 설정 해 야 합 니 다. 그렇지 않 으 면 hibenate 에서 찾 을 수 없습니다.
seqhilo
hilo 알고리즘 을 통 해 이 루어 지지 만 메 인 키 의 역 사 는 Sequence 에 저장 되 어 Sequence 를 지원 하 는 데이터베이스 에 적 용 됩 니 다. 예 를 들 어 Oracle (적 게 사용)
increment
OID 는 Hibernate 에서 점차 증가 하 는 방식 으로 생 성 됩 니 다. 이 알고리즘 은 현재 응용 인 스 턴 스 의 최대 값 변수 에 의존 합 니 다. 여러 개의 응용 인 스 턴 스 가 데이터 베 이 스 를 방문 해 야 할 때 중복 되 는 메 인 키 가 나타 날 수 있 으 므 로 신중하게 사용 해 야 합 니 다.
foreign
다른 연 결 된 대상 의 메 인 키 를 사용 합 니 다. 일반적으로 연합 하여 사용 합 니 다.
guid
데이터베이스 밑 에 있 는 guid 알고리즘 체 제 를 사용 하여 MYSQL 의 uid () 함수, SQL Server 의 new id () 함수, ORACLE 의 rawtohex (sys guid () 함수 등 을 대응 합 니 다.
uuid.hex
같은 이치 의 uid, uid 로 교체 하 는 것 을 권장 합 니 다.
sequence-identity
sequence 정책 의 확장, 즉시 검색 정책 으로 sequence 값 을 가 져 오 려 면 JDBC 3.0 과 JDK 4 이상 (1.4 포함) 버 전이 필요 합 니 다.
사용자 정의 메 인 키 생 성 정책 은 @ GenericGenerator 에서 실 현 됩 니 다. hibenate 는 JPA 를 기반 으로 확장 되 었 습 니 다. hibenate 만 의 메 인 키 생 성 정책 을 도입 할 수 있 습 니 다. @ GenericGenerator 를 통 해 추 가 된 것 입 니 다. 예 를 들 어 JPA 표준 용법 입 니 다.

@Id
@GeneratedValue(GenerationType.AUTO)

hibenate 특유 의 다음 과 같은 용법 으로 이 루어 질 수 있 습 니 다.

@GeneratedValue(generator = "paymentableGenerator")  
@GenericGenerator(name = "paymentableGenerator", strategy = "assigned")

JPA 원본 코드 에서 @ GenericGenerator 의 정의: name 속성 은 생 성기 이름 을 지정 합 니 다. strategy 속성 은 구체 적 인 생 성기 의 클래스 이름 을 지정 합 니 다. parameters 는 strategy 가 지정 한 구체 적 인 생 성기 에 사용 할 인 자 를 얻 습 니 다.

@Target({PACKAGE, TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface GenericGenerator {
 /**
  * unique generator name
  */
 String name();
 /**
  * Generator strategy either a predefined Hibernate
  * strategy or a fully qualified class name.
  */
 String strategy();
 /**
  * Optional generator parameters
  */
 Parameter[] parameters() default {};
}

이 hibernate 메 인 키 생 성 정책 과 각각의 구체 적 인 생 성기 간 의 관계 에 대해 org. hibernate. id. IdentifierGenerator Factory 에서 지정 합 니 다. 아래 12 가지 정책 과 native, Hibernate 는 모두 13 가지 생 성 정책 을 기본적으로 지원 합 니 다.

static {
  GENERATORS.put("uuid", UUIDHexGenerator.class);
  GENERATORS.put("hilo", TableHiLoGenerator.class);
  GENERATORS.put("assigned", Assigned.class);
  GENERATORS.put("identity", IdentityGenerator.class);
  GENERATORS.put("select", SelectGenerator.class);
  GENERATORS.put("sequence", SequenceGenerator.class);
  GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);
  GENERATORS.put("increment", IncrementGenerator.class);
  GENERATORS.put("foreign", ForeignGenerator.class);
  GENERATORS.put("guid", GUIDGenerator.class);
  GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated
  GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);
}

1、native

@GeneratedValue(generator = "paymentableGenerator")  
@GenericGenerator(name = "paymentableGenerator", strategy = "native") 

2、uuid

@GeneratedValue(generator = "paymentableGenerator")  
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid") 

3、hilo

@GeneratedValue(generator = "paymentableGenerator")  
@GenericGenerator(name = "paymentableGenerator", strategy = "hilo") 

4、assigned

@GeneratedValue(generator = "paymentableGenerator")  
@GenericGenerator(name = "paymentableGenerator", strategy = "assigned") 

5、identity

@GeneratedValue(generator = "paymentableGenerator")  
@GenericGenerator(name = "paymentableGenerator", strategy = "identity") 

6、select

@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name="select", strategy="select",
     parameters = { @Parameter(name = "key", value = "idstoerung") })

7、sequence

@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "sequence", 
         parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })

8、seqhilo

@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "seqhilo", 
         parameters = { @Parameter(name = "max_lo", value = "5") })

9、increment

@GeneratedValue(generator = "paymentableGenerator")  
@GenericGenerator(name = "paymentableGenerator", strategy = "increment")

10、foreign

@Entity
public class Employee {
  @Id 
  @GeneratedValue(generator = "idGenerator")
  @GenericGenerator(name = "idGenerator", strategy = "foreign", 
         parameters = { @Parameter(name = "property", value = "info") }) 
  Integer id;
    
  @OneToOne
  EmployeeInfo info;
  ...
}

11、guid

@GeneratedValue(generator = "paymentableGenerator")  
@GenericGenerator(name = "paymentableGenerator", strategy = "guid")

12、uuid.hex

@GeneratedValue(generator = "paymentableGenerator")  
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid.hex") 

13、sequence-identity

@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "sequence-identity", 
         parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })

좋은 웹페이지 즐겨찾기