2016-08-29 16 views
3

OrmLite 5.0のPostgres 9.4データベースでUUIDを主キーとして使用したいと考えています。私は私のオブジェクトを作成OrmLiteとPostgresでUUIDを主キーとして扱うには?

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; 
    } 
} 

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

myDao.create(t); 

しかし、私は次のようなエラーがあります関連するPOJOで

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

テーブルは次のようになり

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. 

文書によれば、OrmLiteはオブジェクトを作成する前に(generatedIdのおかげで)UUIDを生成し、それをVARCHARとして挿入しようとすると失敗します。しかし、私は私のアプリは、IDを変更することができるようにしたくないので、私は、フィールドを読み取り専用にする:

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

グレート、挿入作品が、オブジェクトに設定されているIDから生成されたIDではありませんデータベース(OrmLiteが生成したID)です。

どうすればいいですか?

私はUUIDの外部キーを持ち、OrmLiteがそれらを処理する必要があるので、OrmLiteを使用してネイティブPostgres UUIDフィールドを書くことができます。

答えて

1

すでにすべての定義がデータベースにあります。 ORMがIDを提供しない場合、それは正しく生成されます。ですから、単にORMがそれ自身のIDを作成することを妨げるだけでうまくいくはずです。そのような

何かが役立つかもしれない:

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

期待通り 'generatedId'フラグなしで、作成されたオブジェクトのIDフィールドが自動的に挿入した後に移入されませんので、それは動作しません。さらに、OrmLiteは、どのフィールドがオブジェクトのキーであるかを知ることなく、外部キーを適切に処理できるとは思っていません(私は外部キー管理が必要です)。 – Val

+0

(さらに、私はOrmLiteがUUID Postgresフィールドに書き込むことができるようにする必要があります) – Val

関連する問題