【问题标题】:How to specify EntityListener at runtime in JPA 2.1 and JavaSE?如何在 JPA 2.1 和 JavaSE 中在运行时指定 EntityListener?
【发布时间】: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

【问题讨论】:

    标签: java jpa jdbc cdi


    【解决方案1】:

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

    【讨论】:

    • 我想我可以。但是后来我试图不将实体侦听器耦合到任何 CLI 处理代码,或者就此而言,实际上是程序的任何其他部分,除了所涉及的实体。或者至少限制耦合。我想那部分在我原来的 SO 问题中并不清楚。我确实认为这会奏效。
    猜你喜欢
    • 2013-08-30
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2010-10-28
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多