2014-03-03 5 views
13

Ich versuche, generierte UUIDs ohne @ Id Annotation zu verwenden, weil mein Primärschlüssel etwas anderes ist. Die Anwendung generiert keine UUID, haben Sie eine Idee?Wie UUIDs mit Hibernate als ein Feld verwenden?

Dies ist meine Erklärung:

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

Ich verwende Hibernate 4.3.0 mit Oracle 10g.

+0

Haben Sie die Lösung noch nicht gefunden? Ich habe das gleiche Problem. – rand0m86

+0

Ich benutze die letzte Antwort als Fix –

+0

@FlorianMozart sollten Sie die letzte Antwort akzeptieren – jlb

Antwort

8

versuchen, dies es

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

diese link Dokumente überwintern lesen lesen kann helfen, es ist möglich,

+0

Ich habe Ihre Lösung ohne die @Id Annotation. Keine Verbesserung:/ –

+0

Eclipse wirft einen Fehler auf: "Diese Klasse hat einen zusammengesetzten Primärschlüssel. Sie muss eine ID-Klasse verwenden." –

+2

@Engineer - Sie sollten weitere Erklärungen zu Ihrer Antwort hinzufügen. Links können veralten. Es ist definitiv angemessen, Quellen zu nennen, aber Sie sollten eine angemessene, vollständige Antwort geben. –

2

Es ist nicht, weil Ihre UUID ein Primärschlüssel ist, dass es zwingend notwendig ist es mit @GeneratedValue haben annoted.

Zum Beispiel können Sie etwas tun:

public class MyClass 
{ 
    @Id 
    private String uuid; 

    public MyClass() {} 

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

Und in Ihrer Anwendung, erzeugen eine UUID vor Ihrer Einheit zu speichern:

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

Ich weiß, dass die Wahrscheinlichkeit, zweimal eine UUID zu haben, sehr unwahrscheinlich ist, aber es könnte passieren. Deshalb wollte ich im Winterschlaf UUIDs verwalten. Vielen Dank für Ihre Hilfe –

+0

Hibernate verhindert _nothing_, um einen ID - Konflikt zu vermeiden (vor allem erzeugt es keinen neuen Wert, wenn der erste Wert bereits in der Datenbank existiert) –

4

Überprüfen Sie die Javadoc von GeneratedValue:

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

Mit anderen Worten - es ist nicht möglich mit nur einer Anmerkung ein 'non' zu initialisieren Das Attribut 'ID'.

Aber Sie können @PrePersist verwenden:

@PrePersist 
public void initializeUUID() { 
    if (uuid == null) { 
     uuid = UUID.randomUUID().toString(); 
    } 
} 
Verwandte Themen