최대 절전 모드 자동 증분 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

PKSerial 유형일 때 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.