Java JPA ID属性和@PrePersist上的自定义类
我使用JPA已经有几年了 到目前为止,什么有效 在遗留项目上,“请求”实体的ID如下所示: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
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就会被调用
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