我正在对一个成熟的项目进行一些现代化工作,这个项目的数据库并不是真正的ORM友好。之前的工作是使用Java,但使用的是JDBC。
我正在使用JPA 2.1(EclipseLink)在独立程序上测试水域。对于这个程序,我的显式数据库需求非常简单,SE中的JPA正常。我并不是全新的JPA,但大多数先前的工作都是玩具。
遇到的一个问题:我正在使用的实体具有来自DB列的属性(通过命名的本机查询),并且该属性必须以来自程序命令行的值/字符串作为前缀;在属性真正准备好使用之前。
在'过去'中,我可能刚刚在sql中创建了一个额外的列,或者在SQL中创建了一个字符串cat,并在执行查询之前通过prepared语句的setString()api提供了值。我想我也可以在JPA中这样做;但似乎不是'JPA方式'(不管它是什么)。
我想过在该列上使用AttributeConverter。但我无法弄清楚如何指定由JPA创建和使用的转换器实例使用的运行时数据。
我考虑过使用EntityListener和@PostLoad并在postLoad期间执行前缀。但是又一次,我不确定如何将我的运行时数据/前缀放入JPA从查询中加载数据时使用的侦听器实例中。
我考虑过遵循EntityListener路径,但是使用CDI注入我的前缀使用生成器和限定符。但是我正在为SE而不是EE而写作,我将把这个独立应用程序作为CDI / SE java程序运行。
那么如何使用JPA中的声明性(基于注释)转换器或实体说明符,但是有一个钩子来初始化转换器或侦听器实例?
还是有某种方式;在创建查询之前或获取结果集之前;附加已初始化的属性转换器或实体侦听器?
JPA 2.1 API Java 17 想避免直接(在代码中)绑定到像eclipslink代码的lib(仅使用JPA citerium
答案 0 :(得分:0)
为什么不将前缀存储为程序中的某个静态变量,并通过静态变量在侦听器中使用该前缀?