JPA 2(EclipseLink)尝试使用UUID作为主键EntityManager.find()始终抛出异常(Database is PostgreSQL)

时间:2010-10-30 01:56:36

标签: java postgresql jpa java-ee eclipselink

我正在尝试使用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 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

我真的不确定如何解决这个问题......任何人都有任何想法?

谢谢!

2 个答案:

答案 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类型,这可能有助于绑定类型。