我有一个像这样的JPA实体:
@SomeCDIInterceptorBinding
@Entity
public class Foo { ... }
显然拦截器不起作用,因为JPA返回实体实例而不是适当的CDI代理。那么如何获取我的实体的CDI代理实例,以便方法调用调用我的拦截器?
这是一个'如何'的问题。还有其他方法可以解决我的问题,但我想知道这个具体事情是否以及如何可能。
答案赞赏。
答案 0 :(得分:0)
这是不可能的,因为实体是由像Hibernate这样的JPA实现管理的,而不是由CDI管理的。
答案 1 :(得分:0)
我认为你正在混淆JPA-Bean的Managed
状态和JPA-Implementation的技术细节。可以使用new
创建实体。这意味着他们无法代理。所以新实体最初是不受管理的。要使它们受管理,您可以使用EntityManager.persist
或EntityManager.merge
,但这并不意味着bean被代理。它只是意味着bean已知(通常由它的主键)到JPA-Context。如果您更改了托管实体,则这些更改将在当前事务结束时保留,无需进一步处理。
当您查看entitybeans的reference或collection字段时可能会遇到的代理。它们有助于延迟加载并跟踪事务期间的更改。