Java JPA ID属性和@PrePersist上的自定义类

Java JPA ID属性和@PrePersist上的自定义类,java,jpa,Java,Jpa,我使用JPA已经有几年了 到目前为止,什么有效 在遗留项目上,“请求”实体的ID如下所示: R0000001 R0000002 我将oracle序列转换为表生成器: @Id @Column(name = "requestid", columnDefinition = "varchar(10)") @TableGenerator(pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_NUMBER", pkColumnValue = "REQU

我使用JPA已经有几年了

到目前为止,什么有效 在遗留项目上,“请求”实体的ID如下所示:

R0000001
R0000002
我将oracle序列转换为表生成器:

@Id
@Column(name = "requestid", columnDefinition = "varchar(10)")
@TableGenerator(pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_NUMBER",
    pkColumnValue = "REQUEST_ID", name = "REQUEST_ID", table = "APPSEQUENCES",
    allocationSize = 5)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "REQUEST_ID")
private String requestId;

@PrePersist
public void prependIdWithR() {
  if (null == this.requestId) {
    LOG.error("Could not prepend RequestId which is null!");
    return;
  }

  if (requestId.charAt(0) != "R") {
    final int parsedRequestId = Integer.parseInt(requestId);
    final String formattedId = String.format("A%07d", parsedRequestId);
    LOG.debug("RequestId changed: [{}] => [{}].",
        requestId,
        formattedId);
    this.requestId = formattedId;

    return;
  }
}
这个很好用

什么不起作用/要求 现在,我希望有一个RequestId对象,而不是一个普通字符串,整个代码都使用这个字符串

如果我只是在Id中添加一个
@Converter
,并将类型更改为RequestId,则会发生以下情况:

  • 从序列表中提取Id
  • 调用转换器(在
    上失败,因为生成了
    java.lang.Long
  • 那么prepersist就会被调用
JPA引发的实际异常:

javax.persistence.PersistenceException: An exception occurred while calling convertToEntityAttribute on converter class my.self.RequestIdConverter with value 26
    at org.eclipse.persistence.mappings.converters.ConverterClass.convertDataValueToObjectValue(ConverterClass.java:126) ~[na:na]
Caused by: java.lang.ClassCastException: java.lang.Long incompatible with java.lang.String
    at my.self.RequestIdConverter.convertToEntityAttribute(RequestIdConverter.java:1) ~[classes/:version-SNAPSHOT]
    at org.eclipse.persistence.mappings.converters.ConverterClass.convertDataValueToObjectValue(ConverterClass.java:124) ~[na:na]
这意味着:我需要在
@Convert
之前调用@PrePersist,或者从表生成器返回一个字符串(不是很长)

这种情况可能发生吗?我想我需要一个字符串

到目前为止我发现了什么
  • 如果我使用hibernate,由于自定义生成器类(可能是一个经过修改的表生成器,返回字符串),这是可能的
  • 在普通JPA中没有这样的东西
  • 转换器在
    @PrePersist
    之前调用。转换器是
    ,因为现有表的ID列是
    varchar(10)
  • RequestId是由immutables.github.io生成的普通pojo对象。它只有一个
    字符串getValue()
    方法
  • 我无法将数据库列更改为其他类型
  • 我无法从现有记录中删除前缀
  • 我需要能够读取已经有“R”前缀的旧记录
我可以用
实现一个转换器,然后看看对象是长的还是字符串。这可能吗?我不喜欢任何对象转换器的想法。我怀疑它是否有效,因为它意味着转换为RequestId