2013-03-17 2 views
4

죄송합니다.이 질문에 이미 질문이있는 경우 일부 기사를 읽었지만 대답을 찾지 못했습니다.문자열 기본 키 최대 절전 모드를 만드는 방법. @GeneratedValue strategies

내 목표는 고유 한 필드 IMEI가있는 엔티티 장치를 생성하는 것이며이를 기본 키로 사용하고 장치 등록시 지정합니다 (엔티티를 생성하는 동안 수동으로 지정됨). 개발을 위해 Spring roo 도구를 사용하고 ORM으로 최대 절전 모드로 전환합니다.

내가 엔티티 선언이 지정

:

@RooJavaBean 
@RooToString 
@RooJpaActiveRecord(identifierField = "IMEI", identifierType = String.class) 
public class Device {...} 

나는이 생성 얻을.

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "IMEI") 
private String Device.IMEI; 

MySQL의 DB와 서버에 프로젝트를 배포하는 동안이 오류를

2013-03-17 20:03:23,136 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: create table device (imei varchar(255) not null auto_increment, model varchar(255), name varchar(255) not null, version integer, primary key (imei)) 
2013-03-17 20:03:23,136 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Incorrect column specifier for column 'imei' 

을 얻을 그럼 난 루는

@Id 
@GeneratedValue(generator = "org.hibernate.id.Assigned") 
@Column(name = "the_code") 
private String code; 

으로 필드를 생성 우선

(나는 hear이 발견했습니다)

여전히 오류가 발생하면 코드를이 코드로 간단히 변경했습니다.

@Id 
private String IMEI; 

그리고 잘 작동하고 엔터티를 저장하기 전에 imei 필드를 지정하도록 요청합니다.

내 질문 :

id로 사용자 정의 필드를 사용하는 것이 옳습니다.

는 확인

는 확인이 최대 절전 모드로 생성하지만 장치의 IMEI에서 가져온되지 않는 것입니다 문자열

에 의하여이다.

루는 작동하지 않습니다 (identifierType = String.class = "IMEI"identifierField) @RooJpaActiveRecord에 대한 코드를 생성하는 이유

을 org.hibernate.id.Assigned 무엇

.

은 문자열의 자동 생성 할 가망 생성 primery 키

기본 GeneratedValue 전략 값 (내 마지막 경우)

내가 official doc 읽을 수는 있지만 모든 것을 이해하지 않았다 기사에 저를 참조하시기 바랍니다 것은 무엇인가 어디에서 나는이 모든 것에 대해 읽었습니다.

감사합니다. 긴 질문을 드려 죄송합니다.

답변

11

@GeneratedValue(strategy = GenerationType.AUTO)String 유형과 함께 사용할 수 없습니다. 따라서 ID로 String을 사용하려면 수동으로 할당해야합니다. 그러나 필요에 따라 String을 ID로 사용하는 것이 좋습니다.

org.hibernate.id.Assigned을 사용하면 데이터를 저장하기 전에 ID 값을 할당해야한다는 의미입니다.

@GeneratedValue 주석을 추가하지 않은 경우 기본값은 으로 지정되어 있습니다. 생성기는 식별자 값을 응용 프로그램에서 설정해야 함을 의미합니다.

자세한 내용은 the hibernate manual을 참조하십시오.

11

간단한 해결책은 엔티티 클래스에 @PrePersist 주석을 사용하는 것입니다.

은 단순히 방법

@PrePersist 
private void ensureId(){ 
    this.setId(UUID.randomUUID().toString()); 
} 

을 추가하고 @GeneratedValue 주석을 없애.

PrePersist 문서 : http://docs.oracle.com/javaee/5/api/javax/persistence/PrePersist.html

스테파노

+0

덕분에, 그것은 마법처럼 작동합니다! –

+0

그러나 생성 된 ID가 이미 테이블에 있다면? ID가 안전하게 생성되었지만 ID가 테이블에있을 가능성은 적어도있을 수 있습니다. – user12458

+0

UUID는 문서에서 언급 한 '불변의 보편적으로 유일한 식별자'입니다. –

관련 문제