최대 절전 모드 자동 증분 ID


87

주석과 함께 최대 절전 모드를 사용하는 j2ee 응용 프로그램이 있습니다. 내 pojo 클래스의 Id 필드에 주석을 달아 자동 증가 또는 자동 생성으로 설정하려면 어떻게해야합니까? 빈을 추가 할 때 해당 필드를 빈 빈에 두어야합니까?

답변:


162
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

지속 할 때는 그대로 둡니다 null( 0). ( / 래퍼 null를 사용하는 경우 )IntegerLong

어떤 경우에는 AUTO전략에 해결 SEQUENCE보다 라텐 IDENTITY또는 TABLE당신이 수동으로 설정 할 수 있도록, IDENTITY또는 TABLE(기본 데이터베이스에 따라 다름).

시퀀스 이름을 지정하는 것이 SEQUENCE+ 효과가 있는 것 같습니다 .


내 ID는 문자열 유형입니다. 나는 그것에 무엇을 설정할 것인가. 이 오류가 발생하기 때문입니다. 원인 : javax.el.ELException : org.hibernate.exception.SQLGrammarException : 다음 시퀀스 값을 가져올 수 없음
— cedric

4
자동 증가는 증가하는 숫자임을 의미합니다. 문자열은 증가 할 수 없습니다. 열 INT 확인
— Bozho

데이터베이스의 myid 열은 number 유형입니다. 그리고 나는 이미 내 pojo의 내 ID를 int로 변경했습니다. 오류 시퀀스가 ​​존재하지 않습니다
— cedric

2
Oracle의 경우 SEQUENCE는 자동 증가에 가장 가까운 것입니다. Hibernate가 스키마를 생성하도록하지 않는 한 미리 시퀀스를 생성해야합니다. 특정 시점에 여러 데이터베이스를 지원할 수 있다고 생각되면 TABLE을 사용하십시오.
— Brian Deterling 2010 년

2
신원을 사용하지 마십시오. 오라클은 신원을 지원하지 않으며 시퀀스를 지원합니다.
— JuanZe 2010 년

33

다음과 같이하십시오.

@Id
@GenericGenerator(name="kaugen" , strategy="increment")
@GeneratedValue(generator="kaugen")
@Column(name="proj_id")
  public Integer getId() {
    return id;
 }

kaugen 대신 임의의 이름을 사용할 수 있습니다. 잘 작동했습니다. 콘솔에서 아래 쿼리를 볼 수 있습니다.

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)

이것은 나를 위해 작동합니다. 하지만 ID 값을 설정할 수는 없습니다. 정수 또는 정수로 setID를 시도했지만 언제든지 max를 사용합니다. 어떻게해야합니까?
— desudesudesu

@GenericGenerator (name = "incrementId", strategy = "assigned") @GeneratedValue (generator = "incrementId")를 사용합니다. ID를 직접 설정할 수 있습니다.하지만 id를 전달하지 않으면 0이됩니다.
— 라비 칸트

@Kaushik Lele 전략 = "증가"최대 절전 모드가 내장 된 증가 stratergy입니까? 이 SEQUENCE, IDENTITY, AUTO, TABLE 중 어느 것에 속합니까?
— 기분이 좋고 프로그래밍

테이블에 약 7 억 개의 레코드가 있습니까? 이것은 내가 생각하는 인덱스없이 문제가 될 수
— user2171669

10

참고로

사용 넷빈즈 데이터베이스에서 새 엔티티 클래스 와 MySQL은 , * AUTO_INCREMENT * 열 당신에게 다음과 같은 주석 속성을 생성합니다 :

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;

이것은 열이 null이 아니어야한다는 오류와 동일한 오류가 발생했기 때문에 속성 null을 남겨두고 @NotNull 주석을 제거하면 작동합니다!


7

Hibernate는 5 가지 유형의 식별자 생성 전략을 정의합니다.

AUTO- 기본 DB에 따라 식별 컬럼, 시퀀스 또는 테이블

TABLE -ID가있는 테이블

IDENTITY -ID 열

SEQUENCE- 시퀀스

신원 복사 – 신원이 다른 엔티티에서 복사됩니다.

테이블 사용 예

@Id
@GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator")
@TableGenerator(name="employee_generator", 
                table="pk_table", 
                pkColumnName="name", 
                valueColumnName="value",                            
                allocationSize=100) 
@Column(name="employee_id")
private Long employeeId;

자세한 내용은 링크를 확인하십시오 .


5

자동 증가하려는 숫자 열이있는 경우 columnDefinition직접 설정하는 옵션 일 수 있습니다 . 이는 최대 절전 모드없이 사용되는 경우에도 스키마가 값을 자동 생성한다는 장점이 있습니다. 이것은 당신의 코드를 db에 한정시킬 수 있습니다 :

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql

MySQL은 @Column (columnDefinition = "integer auto_increment")
— yeralin

1

PK 가 Serial 유형일 때 Informix 테이블에 대한 전략을 검색 할 때이 질문에서 "범프"하는 경우 가 있습니다.

나는 이것이 작동한다는 것을 발견했다 ...

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;

이 작업을 수행하려면 session.SaveOrUpdate 를 수행 할 때 special_serial_pk NULL 열의 값을 전달해야합니다 .

제 경우에는 JSON으로 HTML POST 를 수행합니다 .

{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}

0

mysql auto_increment 열과 함께 netbeans 새 엔티티 클래스를 데이터베이스에서 사용하면 다음과 같은 hibernate.hbm.xml이있는 속성이 생성됩니다. id is auto increment

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