在标准API中使用JPA Metamodel首次抛出NPE

时间:2017-12-23 12:08:33

标签: jpa jpa-2.0 criteria openjpa criteria-api

我正在使用JPA Criteria API和JPA元模型。

final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<T> criteria = cb.createQuery(User.class);
final Root<T> root = criteria.from(User.class);
criteria.select(root).where(cb.equal(root.get(User_.username), value));
return em.createQuery(criteria).getResultList();

这里的问题是root.get方法在服务器启动后第一次抛出NPE(即在服务器启动后首次执行),但是从第二次执行开始,相同的代码工作正常。服务器启动后执行第一次执行时无关紧要。它可以在几秒钟后或几分钟后执行。

以下是引发的异常:

java.lang.NullPointerException: null
    at org.apache.openjpa.persistence.criteria.PathImpl.get(PathImpl.java:245) ~[openjpa-2.4.2.jar:2.4.2]

如果你看一下PathImpl.get的源代码

public <Y> Path<Y> get(SingularAttribute<? super X, Y> attr) {
    if (getType() != attr.getDeclaringType()) {
        attr = (SingularAttribute)((ManagedType)getType()).getAttribute(attr.getName());
    }
    return new PathImpl<X,Y>(this, (Members.SingularAttributeImpl<? super X, Y>)attr, attr.getJavaType());
}

它访问attr.getDeclaringType()

如果我查看自动生成的JPA元模型,它看起来如下:

public class User_ {
    public static volatile SingularAttribute<User,String> username;
    ...
}

用户名绝对是空的,但代码除了第一次以外都能正常工作。

在运行时JPA设置值出现在User_.username。

所以问题是如何防止第一次投掷NPE!

使用TomEE 7.0.4

0 个答案:

没有答案
相关问题