JPA 无法与 HttpSession 中管理的 CDI 范围一起使用?
属于最终绑定到 HttpSession 的范围的所有 CDI 托管 bean 都需要可序列化。这意味着所有属性都需要可序列化。 EntityManager 并不是,尽管这似乎被认为是一个错误(此处和这里(我不知道为什么它被关闭。))。
这意味着如果您想遵守规范,则不能使用会话或对话等 CDI 范围中的 JPA。
看来 Java EE 几乎无法使用还是什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你是对的:
EntityManager
不可序列化,但你认为 CDI EG 没有注意到这一点吗:-)?因此,当 CDI bean 被序列化(即 SFSB 的钝化)时,EntityManager 被视为瞬态,但事实并非如此。当 Bean 被反序列化时,EntityManager 会自动重新注入 Bean 中,因此它会像以前一样工作。
问题是当您在 Bean 中使用扩展持久性上下文时。 Java EE 规范不支持此类 bean 的序列化。但是 Java EE 5 的 Seam 2 这样的框架或 Java EE 6 中的 Seam3 Persistence 这样的 CDI 扩展为您提供了管理这些特殊用例的可能性。
you're right :
EntityManager
is not serializable, but do you think CDI EG didn't notice that :-) ?So when a CDI bean is Serialized (i.e. passivation of a SFSB) the EntityManager is considered as transient and is not. When then bean is unserialized the EntityManager is automatically re-injected in the Bean and so it works as it used to be.
The problem is when you use Extended Persistence Context in your Bean. Java EE spec doesn't support serialization of such bean. But framework like Seam 2 for Java EE 5 or CDI extension like Seam3 Persistence in Java EE 6 gives you possibilities to manage those special use cases.