如何使用OrmLite和Postgres处理UUID作为主键?

时间:2016-08-29 11:58:15

标签: java postgresql ormlite

我想在OrmLite 5.0的Postgres 9.4数据库中使用UUID作为主键。

表格如下:

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

使用相关的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;
    }
}

我用:

创建我的对象
Test t = new Test();
t.setText( "testing" );

myDao.create( t );

但我有以下错误:

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在创建对象之前生成一个UUID(感谢generatedId),并且考虑到它试图将其作为VARCHAR插入,它会失败。但我不希望我的应用程序能够更改ID,因此我将该字段设为只读:

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

很好,插入有效,但设置到对象的ID不是从数据库生成的ID(它是OrmLite生成的ID)。

我怎样才能让它发挥作用?

请注意,我需要能够使用OrmLite在本地Postgres UUID字段中编写,因为我将拥有UUID外键,而OrmLite将必须处理它们。

1 个答案:

答案 0 :(得分:1)

您已拥有数据库中的所有定义。如果ORM未提供ID,则将正确生成。因此,简单地阻止ORM创建它自己的ID应该可以正常工作。

这样的事情可能有所帮助:

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