【发布时间】:2014-03-19 16:23:36
【问题描述】:
我正在对一个成熟的项目进行一些现代化工作,该项目的数据库并不是真正的 ORM 友好。之前的工作是在 Java 中,但使用的是 JDBC。
我正在一个独立程序上使用 JPA 2.1 (EclipseLink) 进行测试。对于这个程序,我明确的数据库需求非常简单,SE 中的 JPA 运行良好。我对 JPA 并不完全陌生,但之前的大部分工作都是玩具。
遇到一个问题:我正在使用的实体具有来自 DB 列的属性(通过命名的本机查询),并且该属性必须以来自程序命令行的值/字符串作为前缀;在属性真正准备好使用之前。
在“过去”中,我可能只是在 sql 中创建了一个额外的列,或者在 SQL 中创建了一个字符串 cat,并在执行查询之前通过准备好的语句的 setString() api 提供了值。我想我也可以在 JPA 中做到这一点;但似乎不是“JPA 方式”(不管它是什么)。
我想过在该列上使用 AttributeConverter。但是我真的不知道如何指定将由 JPA 创建和使用的转换器实例使用的运行时数据。
我考虑过使用 EntityListener 和 @PostLoad 并在 postLoad 期间做前缀。但是同样,我不确定如何将我的运行时数据/前缀放入 JPA 在从我的查询中加载数据时将使用的侦听器实例中。
我考虑过遵循 EntityListener 路径,但使用生产者和限定符对我的前缀进行 CDI 注入。但我正在为 SE 而不是 EE 写作,并且我对将这个独立的应用程序作为 CDI/SE java 程序运行持怀疑态度。
那么如何使用来自 JPA 的声明式(基于注释的)转换器或实体侦听器,但有一个挂钩来初始化转换器或侦听器实例?
或者有什么办法;在创建查询之前或在获取结果集之前;附加一个已经初始化的属性转换器或实体监听器?
JPA 2.1 API 爪哇 17 希望避免直接(在代码中)绑定到像 eclipslink 代码这样的库(仅使用 JPA citerium
【问题讨论】: