@Id 및 @GeneratedValue (strategy = GenerationType.IDENTITY) 주석의 사용은 무엇입니까? 세대 유형이 정체성 인 이유는 무엇입니까?


83
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY)

이 주석을 사용하는 이유는 무엇입니까? 이 자동 증가 테이블 ID 값을 알아야합니다. (GenerationType.IDENTITY)이 주석을 사용할 때 실제로 일어나는 다른 유형이 있습니까?

public class Author extends Domain
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id") 
    private Integer id;

    @Basic(optional = false)
    @Column(name = "name") 
    private String name;

    @Column(name = "address") 
    private String address; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "authorId")
    private List<Book>
    bookList;

    public Author()
    { 
        setServiceClassName("wawo.tutorial.service.admin.AuthorService");
    }
}

* 도메인 추상 클래스 확장이 필요한가요?


답변:


123

이 질문에 답하겠습니다.
우선, 구성 방법으로 주석을 사용하는 것은 끝없는 XML 구성 파일을 처리하는 대신 편리한 방법 일뿐입니다.

@Id주석은에서 상속 javax.persistence.Id현재 엔티티의 기본 키가 아래 부재 필드를 나타낸다. 따라서 Hibernate 및 Spring 프레임 워크는 reflect이 주석을 기반으로 몇 가지 작업을 수행 할 수 있습니다 . 자세한 내용 은 Id에 대한 javadoc을 확인하십시오.

@GeneratedValue주석은 지정된 열 (필드)의 증가의 길을 구성하는 것입니다. 예를 들어를 사용할 때 테이블 정의에 Mysql지정 auto_increment하여 자체 증분으로 만든 다음 사용할 수 있습니다.

@GeneratedValue(strategy = GenerationType.IDENTITY)

Java 코드에서이 데이터베이스 서버 측 전략을 사용하는 것에 동의했음을 나타냅니다. 또한 다른 요구 사항에 맞게이 주석의 값을 변경할 수 있습니다.

1. 데이터베이스에서 시퀀스 정의

예를 들어 Oracle은 sequence증분 방법 으로 사용해야합니다. Oracle 에서 시퀀스를 생성한다고 가정합니다.

create sequence oracle_seq;

2. 데이터베이스 시퀀스 참조

이제 데이터베이스에 시퀀스가 ​​있지만 다음을 사용하여 Java와 DB 간의 관계를 설정해야합니다 @SequenceGenerator.

@SequenceGenerator(name="seq",sequenceName="oracle_seq")

sequenceNameOracle에서 시퀀스의 실제 이름이며 nameJava에서 호출하려는 것입니다. sequenceName과 다른 경우 지정해야 name합니다 name. 그렇지 않으면 . 나는 보통 무시한다sequenceName 시간을 절약하기 위해 합니다.

3. 자바에서 시퀀스 사용

마지막으로 Java에서이 시퀀스를 사용할 때입니다. 다음을 추가하십시오 @GeneratedValue.

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")

generator필드는 사용할 시퀀스 생성기를 나타냅니다. DB의 실제 시퀀스 이름이 아니라 name필드에 지정한 이름 입니다 SequenceGenerator.

4. 완료

따라서 완전한 버전은 다음과 같아야합니다.

public class MyTable
{
    @Id
    @SequenceGenerator(name="seq",sequenceName="oracle_seq")        
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")               
    private Integer pid;
}

이제 이러한 주석을 사용하여 JavaWeb 개발을 더 쉽게 만드십시오.


Oracle 11.2 용 SequenceGenerator 주석의 적절한 구문은 @SequenceGenerator (name = "seq", sequenceName = "ORACLE_SEQ", assignmentSize = 1)입니다. 그렇지 않으면 assignmentSize 매개 변수가 없으면 매우 이상한 결과가 생성됩니다 (내 경우에는 부정적).
hariprasad

@hariprasad 제 경우에 설정하지 않으면 증가는 10입니다. 그러나 여전히 이것은 선택적 매개 변수입니다.
Rugal

내 친구 중 한 명이 @Id는 고유 한 식별을위한 것입니다. 코드 우선 접근 방식을 따를 경우 기본 키가 다른 경우 차이가됩니다. 위의 문장을 설명해 주시겠습니까?
P Satish Patro

@PSatishPatro 맞습니다. Id는 물론 고유 한 레코드입니다. 그러나 우리는 NoSQL의 경우에도 테이블 정의에 항상 그런 것들을 가질 것입니다
Rugal

23

개체 관계형 매핑 컨텍스트에서 모든 개체에는 고유 식별자가 있어야합니다. 당신이 사용하는 @Id엔티티의 기본 키를 지정하는 주석을.

@GeneratedValue주석은 기본 키를 생성하는 방법을 지정하는 데 사용됩니다. 귀하의 예에서는 다음과 같은 Identity전략을 사용하고 있습니다.

지속성 공급자가 데이터베이스 ID 열을 사용하여 엔터티에 대한 기본 키를 할당해야 함을 나타냅니다.

다른 전략이 있습니다 . 여기에서 더 많은 것을 볼 수 있습니다 .


8
"지속성 공급자가 데이터베이스 ID 열을 사용하여 엔티티의 기본 키를 지정해야 함을 나타냅니다."당신이 expalain 수
Lijo

2
@ 404 기본 키 생성에 사용되는 전략 데이터베이스 중 하나는 할당 된 ID 만 저장하는 열 (YMMV)이있는 테이블을 유지하는 것입니다. 새 행을 입력해야하는 경우 원래 테이블에 없었던 새 ID가 생성되어 사용됩니다.
소티 리오스 Delimanolis

1
그래서 ID의 자동 증가입니까?
Lijo

1
@ 404 나는 그것이 데이터베이스에 달려 있다고 생각합니다. MySQL을 사용하면 그렇게 보이지만 다른 DB와 다를 수 있습니다.
소티 리오스 Delimanolis

11
Simply, @Id: This annotation specifies the primary key of the entity. 

@GeneratedValue: This annotation is used to specify the primary key generation strategy to use. i.e Instructs database to generate a value for this field automatically. If the strategy is not specified by default AUTO will be used. 

GenerationType enum defines four strategies: 
1. Generation Type . TABLE, 
2. Generation Type. SEQUENCE,
3. Generation Type. IDENTITY   
4. Generation Type. AUTO

GenerationType.SEQUENCE

With this strategy, underlying persistence provider must use a database sequence to get the next unique primary key for the entities. 

GenerationType.TABLE

With this strategy, underlying persistence provider must use a database table to generate/keep the next unique primary key for the entities. 

GenerationType.IDENTITY
This GenerationType indicates that the persistence provider must assign primary keys for the entity using a database identity column. IDENTITY column is typically used in SQL Server. This special type column is populated internally by the table itself without using a separate sequence. If underlying database doesn't support IDENTITY column or some similar variant then the persistence provider can choose an alternative appropriate strategy. In this examples we are using H2 database which doesn't support IDENTITY column.

GenerationType.AUTO
This GenerationType indicates that the persistence provider should automatically pick an appropriate strategy for the particular database. This is the default GenerationType, i.e. if we just use @GeneratedValue annotation then this value of GenerationType will be used. 

참조 :-https: //www.logicbig.com/tutorials/java-ee-tutorial/jpa/jpa-primary-key.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.