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

Bri*_*asa 5 java postgresql jpa eclipselink java-ee

我正在尝试使用JPA 2(EclipseLink)将UUID用于主键.我正在使用PostgreSQL作为数据库.我的实体声明如下:我有一个Employee表,其PK设置为UUID.我有一个JPA实体映射到employee表,如下所示:

@Entity
public class Employee {
    @Id
    private String id;
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我调用EntityManager.find(Employee.class,id)时

我从postgres得到一个例外:

内部异常:org.postgresql.util.PSQLException:错误:运算符不存在:uuid =字符变化

提示:没有运算符匹配给定的名称和参数类型.您可能需要添加显式类型转换.

我也尝试将Employee类中的id更改为java.util.UUID,但后来我得到以下(非常类似的错误):

内部异常:org.postgresql.util.PSQLException:错误:运算符不存在:uuid = bytea提示:没有运算符匹配给定的名称和参数类型.您可能需要添加显式类型转换.

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

谢谢!

Pas*_*ent 3

我正在尝试使用 JPA 2 (EclipseLink) 将 UUID 作为主键

不幸的是,标准 JPA 不包括 UUID 作为生成标识符的策略。

我还尝试将 Employee 类中的 id 更改为 java.util.UUID (...)

这不是 an 的有效类型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 。