当前位置: 首页 > 知识库问答 >
问题:

JPA:AttributeConverter的参数化实例

谢建业
2023-03-14

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

我们想使用JPA(EclipseLink)和定制转换器。问题是@Convert需要一个实现AttributeConverter的类,因此我们必须为每个模式创建新的类。我想要的是一个BooleanConverter类,它可以用值'Y'/'N'或'X'/''实例化。

这显然超出了JPA规范,但也许可以使用EclipseLink注释/配置。查看其@Convert注释,可以通过名称指定转换器。如果我可以注册ynBooleanConverterxSpaceBooleanConverter,这听起来不错:

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

@Entity
public class MyEntity {

    @Convert("ynBooleanConverter")
    private Boolean myBoolean;

    ...
}

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

共有3个答案

仇飞鹏
2023-03-14

对这个线程来说已经太晚了,但是这里有一篇博客文章展示了如何编写JPA转换器。具有用于String和LocalDate转换的工作代码。

唐健
2023-03-14

因此,您的转换器的行为取决于上下文中的某些状态?我想我会尝试将上下文信息绑定到一个线程本地变量,我可以在转换器实现中读取该变量。

您有权访问CDI实现吗?然后,将带有上下文信息的bean注入到转换器实现中就更优雅了。您提到缺少一些会话-方法?也许一个@SessionScope'ed bean会帮助你。

遗憾的是,@Inject未在转换器类中指定。您需要像本文中提到的那样“手动”查找bean。

宇文俊风
2023-03-14

请尝试@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;
}
 类似资料:
  • 本文向大家介绍Scala没有参数的实例化类:{} vs(),包括了Scala没有参数的实例化类:{} vs()的使用技巧和注意事项,需要的朋友参考一下 示例 假设我们有一个MyClass类,没有构造函数参数: 在Scala中,我们可以使用以下语法实例化它: 或者我们可以简单地写: 但是,如果不注意,在某些情况下,可选的括号可能会产生某些意外的行为。假设我们要创建一个任务,该任务应在单独的线程中运行

  • 问题内容: 由于引入了泛型,因此对Class进行了参数化,因此List.class生成Class 。这很清楚。 我无法弄清楚的是如何获取本身已参数化的Class类型的实例,即Class >。像下面的代码片段一样: 我经常遇到这个问题的变种,但我仍然不知道,是否只是想念一些东西,或者真的没有更好的方法。感谢您的建议。 问题答案: Class类是一种类型的运行时表示。由于参数化类型在运行时会进行类型擦

  • 函数模板、成员函数模板、或类模板的成员函数或静态数据成员的专门化可以在翻译单元内具有多个实例化点,并且除了上述实例化点之外,对于在翻译单元内具有实例化点的任何这样的专门化,翻译单元的末尾也被认为是实例化点。类模板的专门化在翻译单元中最多有一个实例化点。任何模板的专门化都可能在多个翻译单元中具有实例化点。如果两个不同的实例化点根据一个定义规则赋予一个模板专门化不同的含义,则程序是格式不良的,不需要诊

  • 问题内容: 我迷失在通用丛林中,请帮助我:)我有这样的事情: 据我认为,编译器应该实现,因为它实现了。 为什么会出现此错误? 我该如何工作? ps:如果您对此有更好的标题,请进行更改。我无法弥补。 问题答案: 问题是,您的构造函数需要一个,并且在您的代码中将其推断为。 因此,您应该通过,然后通过。但是您不能像那样直接传递该实例。 但是,您可以通过将类强制转换为所需实例来解决此问题: 请注意,如何首

  • 本文向大家介绍Jmeter参数化实现方法及应用实例,包括了Jmeter参数化实现方法及应用实例的使用技巧和注意事项,需要的朋友参考一下 当使用JMeter进行测试时,测试数据的准备是一项重要的工作。若要求每次迭代的数据不一样时,则需进行参数化,然后从参数化的文件中来读取测试数据。 参数化:是自动化测试脚本的一种常用技巧,可将脚本中的某些输入使用参数来代替,如登录时利用GET/POST请求方式传递参

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 谁能给我示例如何在MySQL / PHP中使用参数化查询的例子? 问题答案: 参数化查询本质上是抽象出所有输入的查询。这具有几个良好的副作用,例如使所有输入无害(即不可能进行有害注入),并且由于它是预先分析和编译的,因此在重复使用时使其更快,