在运行时获取JPA实体的CDI代理

时间:2018-01-31 17:04:57

标签: jpa java-ee cdi interceptor

我有一个像这样的JPA实体:

@SomeCDIInterceptorBinding
@Entity
public class Foo { ... }

显然拦截器不起作用,因为JPA返回实体实例而不是适当的CDI代理。那么如何获取我的实体的CDI代理实例,以便方法调用调用我的拦截器?

这是一个'如何'的问题。还有其他方法可以解决我的问题,但我想知道这个具体事情是否以及如何可能。

答案赞赏。

2 个答案:

答案 0 :(得分:0)

这是不可能的,因为实体是由像Hibernate这样的JPA实现管理的,而不是由CDI管理的。

答案 1 :(得分:0)

我认为你正在混淆JPA-Bean的Managed状态和JPA-Implementation的技术细节。可以使用new创建实体。这意味着他们无法代理。所以新实体最初是不受管理的。要使它们受管理,您可以使用EntityManager.persistEntityManager.merge,但这并不意味着bean被代理。它只是意味着bean已知(通常由它的主键)到JPA-Context。如果您更改了托管实体,则这些更改将在当前事务结束时保留,无需进一步处理。

当您查看entitybeans的reference或collection字段时可能会遇到的代理。它们有助于延迟加载并跟踪事务期间的更改。