将实体管理器注入托管bean

Alf*_*Alf 2 jsf-2 jpa-2.0

可以使用@PersistenceContext(或@PersistenceUnit)将实体管理器(或其工厂)注入jsf托管bean 吗?

我尝试了但没有,我获得了NullPointerException.

Dre*_*w H 7

对的,这是可能的.这是语法.

@PersistenceContext
EntityManager em;
Run Code Online (Sandbox Code Playgroud)

您需要在项目中使用persistence.xml.顺便说一句:我正在运行Glassfish 3.

之后,您可以使用em.createNamedQuery等方法.

还要记住注入发生在构造函数之后,所以如果你试图在构造函数中执行数据库函数,这将无法工作.您必须将@PostConstruct注释添加到方法中.这可能是你的问题.

  • 请注意,如果注入到JSF托管bean中,EntityManager将不使用容器管理的事务(CMT).在Java EE 7之前,只有EJB使用容器管理的事务,而Java EE 7仅将CMT扩展到CDI bean,而不是不推荐使用的JSF托管bean.换句话说,如果出现错误,容器将不会回滚事务:您必须自己管理它.[参考](http://stackoverflow.com/a/17842796/201891)和[参考](/sf/ask/614052281/). (2认同)