这可能是一个愚蠢的问题,因为手头的问题相当简陋,而且我更确定答案很可能很简单。尽管如此,即使经过几个小时的挖掘,我也无法找到解决问题的全面解决方案。
我正在使用带有Java的PostgreSQL数据库的ORMLite。当我试图将对象持久化到映射表时,自定义的Postgres枚举数据类型似乎让我很头疼。
以下是这种情况的一个例子:
Java类注释如下:
@DatabaseTable(tableName = "customer")
public class Customer {
@DatabaseField(id = true)
private int id;
@DatabaseField
private String name;
@DatabaseField(dataType = DataType.ENUM_STRING)
private CustomerType customerType;
...
枚举定义如下:
public enum CustomerType{
company, private, unknown
}
Postgres数据类型(“customertype”)被定义为枚举类型(在pg_enum& pg_type表中),具有以下值:
"company"
"private"
"unknown"
...并且列本身定义为此类型:
ALTER TABLE public.customer ADD COLUMN type customertype;
当我尝试使用ORMLite向customer表插入一个新行时,我得到以下异常,这告诉我映射是一些搞砸的东西,并且ORMLite似乎错误地将值作为varchar处理,而不是自定义的枚举类型:
org.postgresql.util.PSQLException: ERROR: column "type" is of type customertype but expression is of type character varying
我对如何正确映射枚举类型感到困惑。我已经尝试了大多数不同的数据类型的数据库字段定义和其他持久性规则,没有运气。
可能很明显,我对ORMLite很新,所以所有的帮助都不仅仅是值得赞赏的!
答案 0 :(得分:0)
一般情况下,ORM在自定义数据库类型中表现不佳。
通过将stringtype设置为unspecified可能会有一些运气;将stringtype=unspecified
附加到JDBC参数。这告诉PgJDBC将java.sql.Types.VARCHAR
类型的参数发送为unknown
而不是默认的text
。 PostgreSQL不会从text
隐式地转换为枚举,但它将从未知类型的文字转换为枚举。
在我看来,PostgreSQL在这里投射过于严格,但我还没有太多运气说服那些pgsql-hackers的相关人员。