JPA:AttributeConverter的参数化实例

sin*_*pop 9 java orm hibernate jpa eclipselink

我们正在开发一个连接到遗留数据库的应用程序.这是非常"无类型",几乎所有数据都使用字符串.更糟糕的是,这是非常均匀的:它使用不同的日期或时间模式('YYDDMM','HHMMSS',毫秒)和布尔值('Y'/'N','X'/''),例.

我们想要使用JPA(EclipseLink)和自定义转换器.问题是@Convert期望一个类实现AttributeConverter,所以我们必须为每个模式做新的类.我想要的是一个BooleanConverter类,可以使用值'Y'/'N'或'X'/'来实例化.

这显然超出了JPA规范,但也许可以使用EclipseLink注释/配置.查看其@Convert注释,可以按名称指定转换器.如果我可以注册一个ynBooleanConverter并且xSpaceBooleanConverter:

// Unfortunately, this method does not exist :(
Session.addConverter('ynBooleanConverter', new BooleanConverter("Y", "N")); 

@Entity
public class MyEntity {

    @Convert("ynBooleanConverter")
    private Boolean myBoolean;

    ...
}
Run Code Online (Sandbox Code Playgroud)

可能吗?我们还有其他选择吗?

Ish*_*Ish 2

尝试@ObjectTypeConverter

@Entity
@ObjectTypeConverters({
    @ObjectTypeConverter(name = "ynBooleanConverter", objectType = Boolean.class, dataType = String.class, 
        conversionValues = { 
        @ConversionValue(objectValue = "true", dataValue = "Y"), 
        @ConversionValue(objectValue = "false", dataValue = "N") }),
    @ObjectTypeConverter(name = "xSpaceBooleanConverter", objectType = Boolean.class, dataType = String.class, 
        conversionValues = { 
        @ConversionValue(objectValue = "true", dataValue = "X"), 
        @ConversionValue(objectValue = "false", dataValue = " ") }),
})
public class MyEntity {

    @Convert("ynBooleanConverter")
    private boolean ynBoolean;

    @Convert("xSpaceBooleanConverter")
    private boolean xSpaceBoolean;
}
Run Code Online (Sandbox Code Playgroud)