我想在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将必须处理它们。
答案 0 :(得分:1)
您已拥有数据库中的所有定义。如果ORM未提供ID,则将正确生成。因此,简单地阻止ORM创建它自己的ID应该可以正常工作。
这样的事情可能有所帮助:
@DatabaseField( dataType = DataType.UUID_NATIVE, readOnly = true )