2014-03-03 4 views
13

@Id 주석없이 생성 된 UUID를 사용하려고합니다. 왜냐하면 기본 키가 다른 것입니다. 응용 프로그램이 UUID를 생성하지 않습니다. 아이디어가 있습니까?Hibernate를 필드로 사용하는 UUID를 사용하는 방법은 무엇입니까?

@Column(name = "APP_UUID", unique = true) 
@GeneratedValue(generator="system-uuid") 
@GenericGenerator(name="system-uuid", strategy = "uuid") 
private String uuid; 

내가 오라클 10g와 최대 절전 모드 4.3.0을 사용하고 있습니다 :

이 내 선언입니다.

+0

는 아직 해결책을 발견 했습니까? 나는 똑같은 문제를 겪고있다. – rand0m86

+0

마지막 답을 수정으로 사용합니다 –

+0

@FlorianMozart 마지막 답을 받아 들여야합니다 – jlb

답변

8

@Id 
@GeneratedValue(generator = "hibernate-uuid") 
@GenericGenerator(name = "uuid", strategy = "uuid2") 
@Column(name = "uuid", unique = true) 
private String uuid; 

link이 UUID는 그것이 @GeneratedValue와 annoted해야하는 필수 있다는 기본 키가 있기 때문에 그것은 아니다

+0

@Id 주석없이 솔루션을 사용했습니다. 개선 없음 :/ –

+0

Eclipse에서 "이 클래스에는 복합 기본 키가 있으며 ID 클래스를 사용해야합니다."라는 오류가 발생합니다. –

+2

@ 엔지니어 - 답변에 더 많은 설명을 추가해야합니다. 링크가 쓸모 없게 될 수 있습니다. 근원을 인용하는 것이 분명하지만, 적절하고 완전한 응답을 제공해야합니다. –

2

수 있습니다 문서를 최대 절전 모드 읽기 읽기 도움이 될 수 있습니다 이것을 시도.

예를 들어, 당신은 같은 것을 할 수 있습니다

String uuid = UUID.randomUUID().toString(); 
em.persist(new MyClass(uuid)); // em : entity manager 
+0

UUID를 두 번 가질 확률은 매우 낮지 만 일어날 수 있습니다. 그래서 나는 최대 절전 모드로 UUID를 관리하기를 원했다. 당신의 도움을 주셔서 감사합니다. –

+0

Hibernate는 ID 충돌을 막기 위해 _nothing_ 않습니다 (특히 첫 번째 값이 이미 데이터베이스에 존재한다면 새로운 값을 생성하지 않습니다) –

4

확인 GeneratedValue의 자바 독 :

public class MyClass 
{ 
    @Id 
    private String uuid; 

    public MyClass() {} 

    public MyClass (String uuid) { 
     this.uuid = uuid; 
    } 
} 

그리고 앱에서

, 당신의 실체를 저장하기 전에 UUID를 생성

Provides for the specification of generation strategies for the values of primary keys.

다른 말로하면 '주석을 초기화하면' e ID '속성을 사용합니다.

하지만 당신은 @PrePersist를 사용할 수 있습니다

@PrePersist 
public void initializeUUID() { 
    if (uuid == null) { 
     uuid = UUID.randomUUID().toString(); 
    } 
} 
관련 문제