如何在JPA 2.1和JavaSE中在运行时指定EntityListener?

时间:2014-03-19 16:23:37

标签: java jpa jdbc cdi

我正在对一个成熟的项目进行一些现代化工作,这个项目的数据库并不是真正的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

1 个答案:

答案 0 :(得分:0)

为什么不将前缀存储为程序中的某个静态变量,并通过静态变量在侦听器中使用该前缀?