我有这个使用JSF 2.0和EclipseLink的应用程序,我有为MySQL制作的数据库创建的实体,使用netbeans 7.1.2创建这些实体,它是自动创建的。
然后我使用会话bean来处理这些实体,事情是em.createQuery
总是返回null,虽然我检查了实体中的NamedQueries并且它们完全匹配
来自名为查询的实体的示例: -
@NamedQueries({
@NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
@NamedQuery(name = "Users.findByUserId", query = "SELECT u FROM Users u WHERE u.userId = :userId"),
@NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username"),
@NamedQuery(name = "Users.findByEmail", query = "SELECT u FROM Users u WHERE u.email = :email"),
注意我在会话bean中如何使用这个findByEmail查询: -
public Users findByEmail(String email){
em.getTransaction().begin();
String find = "Users.findByEmail";
Query query = em.createNamedQuery(find);
query.setParameter("email", email);
Users user = (Users) query.getSingleResult();
但它总是从这个em.createNamedQuery返回null,我尝试先使用.createQuery,但它也没有用。
异常的堆栈跟踪
Caused by: java.lang.NullPointerException
at com.readme.entities.sessionBeans.UsersFacade.findByEmail(UsersFacade.java:48)
at com.readme.user.signup.SignupBean.checkAvailability(SignupBean.java:137)
at com.readme.user.signup.SignupBean.save(SignupBean.java:146)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
这似乎是什么问题?
答案 0 :(得分:1)
如果em.createNamedQuery(find)
确实是在你的情况下抛出NullPointerException的语句,那么就会发生一些奇怪的事情。
当您在em
中第一次使用em.getTransaction().begin()
引用时,很可能会抛出NullPointerException。如果是这种情况,那么一个非常常见的原因是您的实体管理器未被注入,因为注入仅在托管类中有效(有关详细信息,请参阅this question)。如果您通过新操作创建了会话bean,则不会对其进行管理。
其他常见原因是缺少@Persistenceontext注释。