2016-08-29 2 views
3

Ich möchte UUID als Primärschlüssel auf einer Postgres 9.4-Datenbank mit OrmLite 5.0 haben.Wie behandelt man UUID als Primärschlüssel mit OrmLite und Postgres?

Die Tabelle wie folgt aussehen:

CREATE TABLE "test"(
    "id" UUID PRIMARY KEY DEFAULT gen_random_uuid(), 
    "text" TEXT 
) 

Mit dem zugehörigen POJO:

package test; 

import java.util.UUID; 

import com.j256.ormlite.field.DatabaseField; 
import com.j256.ormlite.field.DataType; 
import com.j256.ormlite.table.DatabaseTable; 

@DatabaseTable(tableName = "test") 
public class Test 
{ 
    @DatabaseField(generatedId = true, dataType = DataType.UUID_NATIVE) 
    private UUID id; 
    @DatabaseField 
    private String text; 

    public Test() 
    {} 

    public UUID getId() 
    { 
     return this.id; 
    } 
    public void setId(UUID id) 
    { 
     this.id = id; 
    } 
    public String getText() 
    { 
     return this.text; 
    } 
    public void setText(String text) 
    { 
     this.text = text; 
    } 
} 

Ich eröffne mein Objekt mit:

Test t = new Test(); 
t.setText("testing"); 

myDao.create(t); 

Aber ich habe folgende Fehlermeldung:

org.postgresql.util.PSQLException: ERROR: column "id" is of type uuid but expression is of type character varying 
Hint: You will need to rewrite or cast the expression. 

In Ordnung, das Dokument sagt, dass Ormlite vor dem Erstellen des Objekts eine UUID erzeugt (dank generatedId), und da es versucht, es als VARCHAR einzufügen, schlägt es fehl. Aber ich will nicht meine App der Lage sein, die IDs zu ändern, so dass ich das Feld schreibgeschützt:

@DatabaseField(generatedId = true, dataType = DataType.UUID_NATIVE, readOnly = true) 

Große, der Einsatz funktioniert, aber die ID für das Objekt festgelegt ist nicht die ID erzeugt aus die Datenbank (es ist die von OrmLite generierte ID).

Wie kann ich es funktionieren lassen?

Beachten Sie, dass ich in der Lage in nativen Postgres UUID Felder mit Ormlite schreiben kann, da ich UUID Fremdschlüssel haben werde und OrmLite muss damit umgehen.

Antwort

1

Sie haben bereits alle Definitionen in der Datenbank. Wenn das ORM die ID nicht bereitstellt, wird es ordnungsgemäß generiert. Also einfach zu verhindern, dass das ORM seine eigene ID erstellen, sollte gut funktionieren.

So etwas helfen könnten:

@DatabaseField(dataType = DataType.UUID_NATIVE, readOnly = true) 
+0

Es ist nicht wie erwartet funktioniert, denn ohne die 'generatedId' Flag, das ID-Feld auf das erzeugte Objekt wird nach dem Einsatz nicht automatisch ausgefüllt. Außerdem glaube ich nicht, dass OrmLite Fremdschlüssel richtig behandeln kann, ohne dass er weiß, welches Feld der Schlüssel für die Objekte ist (und ich benötige die Verwaltung von Fremdschlüsseln). – Val

+0

(außerdem brauche ich OrmLite um in UUID Postgres Felder schreiben zu können) – Val

Verwandte Themen