我正在尝试使用JPA 2(EclipseLink)将UUID用于主键。我正在使用PostgreSQL作为数据库。我的实体声明如下:我有一个Employee表,其PK设置为UUID。我有一个JPA实体映射到employee表,如下所示:
@Entity
public class Employee {
@Id
private String id;
...
...
}
当我调用EntityManager.find(Employee.class,id)
时我从postgres得到一个例外:
内部异常:org.postgresql.util.PSQLException:错误:运算符不存在:uuid =字符变化
提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
我也尝试将Employee类中的id更改为java.util.UUID,但后来我得到以下内容(非常相似的错误):
内部异常:org.postgresql.util.PSQLException:错误:运算符不存在:uuid = bytea 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
我真的不确定如何解决这个问题......任何人都有任何想法?
谢谢!
答案 0 :(得分:3)
我正在尝试使用JPA 2(EclipseLink)
将UUID用于主键
不幸的是,标准JPA不包含UUID作为生成标识符的策略。
我也尝试将Employee类中的id更改为java.util.UUID(...)
这不是Id
的有效类型(在您的情况下已被视为Serializable
)。 JPA 2.0规范声明:
2.4主键和实体标识
...
复合主键的简单主键或字段或属性 应该是以下类型之一: 任何Java原始类型;任何原始的 包装类型;
java.lang.String
;java.util.Date
;java.sql.Date
;java.math.BigDecimal
;java.math.BigInteger
即可。如果 主键是复合主键 派生自主键 另一个实体,主键可以 包含类型为的属性 主键的那个 如上所述的引用实体 第2.4.1节。 主要的实体 密钥使用除这些之外的类型 不可移植。如果生成主要 使用键,只有整数类型 将是便携式的。如果java.util.Date
用作主键字段或 属性,时间类型应该是 指定为DATE
。
换句话说,如果有解决方案,它将是提供商特定的。
我真的不确定如何解决这个问题......任何人都有任何想法?
您需要配置EL以进行自定义排序并提供自定义序列生成器。有关完整示例(使用UUID生成器),请参阅EclipseLink/Examples/JPA/CustomSequencing。
答案 1 :(得分:1)
错误似乎表明您将id绑定为String,但数据库不允许这样做。如果直接从JDBC访问该类型,则返回什么类型?您可能需要在班级中使用此类型并使用转换器进行映射。
请参阅, http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#Using_EclipseLink_JPA_Converters
EclipseLink还允许在DatabaseField上设置JDBC类型,这可能有助于绑定类型。