当前位置: 首页 > 面试题库 >

Hibernate / JPA-访问SingularAttribute参数时出现NullPointerException

岳晟
2023-03-14
问题内容

我正在尝试对Hibernate 5.0.7.Final使用JPA2类型安全的条件查询。

...
criteria.where( builder.equal( root.get(SingularAttribute.attr), value ));
//where parameters are
//criteria.where( builder.equal( root.get(Person_.name), "Can" ));
...

root.get总是抛出异常NullPointerException。元模型类Person_用于Person通过产生org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor

在未填充的JPA /Hibernate静态元模型属性中提出了类似的问题-NullPointerException,但这一次这两个类位于同一包中。

堆栈跟踪:

java.lang.NullPointerException
at org.hibernate.jpa.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:123)

我的代码:

我用来确保它们将具有的接口getId();

package it.unibz.db.hibernate.model;

public interface ModelInterface<PK extends Serializable> extends Serializable {
    PK getId();
}

模型类

package it.unibz.db.hibernate.model;

@Entity
@Table(name ="person")
public class Person implements ModelInterface<Integer> {
    @Id
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }
    //other getter and setters
}

生成的元模型Person_类

package it.unibz.db.hibernate.model;

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Person.class)
public abstract class Person_ {

    public static volatile SingularAttribute<Person, String> name;
    public static volatile SingularAttribute<Person, Integer> id;

}

我随PersonDao继承的通用DAO类

public class GenericDao<E extends ModelInterface<PK>, PK extends Serializable> implements DaoInterface<E, PK> {
private Class<E> type;

public GenericDao(Class<E> type) {
    this.type = type;
    //called as super(ClassName.class); eg. super(Person.class);
}

public List<E> readBy(SingularAttribute column, String value) throws Exception {
    EntityManager em = HibernateUtil.getEntityManager();
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<E> criteria = builder.createQuery(type);
    Root<E> root = criteria.from(type);

    criteria.select(root);
    criteria.where( builder.equal( root.get(column), value ));
    List<E> entityList = em.createQuery(criteria).getResultList();
    em.close();
    return entityList;
    }
}

我的一些依赖

  • hibernate-c3p0 5.0.7。最终版

  • 休眠实体管理器5.0.7。最终版

  • PostgreSQL 9.4.1207.jre7

  • hibernate-jpamodelgen 5.0.7。最终版

编辑:

在main方法中运行此代码有效

EntityManager em = HibernateUtil.getEntityManager();
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
Root<Person> root = criteria.from(Person.class);
criteria.select(root);
criteria.where( builder.equal( root.get(Person_.name), "Can" ));
List<Person> entityList = em.createQuery(criteria).getResultList();
//do stuff with entityList

但是方法中包含的相同代码将引发NullPointerException

public List<Person> readBy(SingularAttribute column, String value) throws Exception {
    log.debug("Reading entity by");

    EntityManager em = HibernateUtil.getEntityManager();
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
    Root<Person> root = criteria.from(Person.class);

    criteria.select(root);
    criteria.where( builder.equal( root.get(column), value ));
    List<Person> entityList = em.createQuery(criteria).getResultList();
    em.close();
    return entityList;
}

因此看来问题出在将SingularAttribute参数传递给方法readBy(SingularAttribute column, String value)

我在main中测试了此代码,并打印了 false

EntityManager em = HibernateUtil.getEntityManager();
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
Root<Person> root = criteria.from(Person.class);
System.out.println(root.get(Person_.name) == null); //false

同时,此引发InvocationTargetException是由NullPointerExceptionat
引起的root.get(column)

//invoked as personDao.test(Person_.name) from main
public void test(SingularAttribute column) {
    EntityManager em = HibernateUtil.getEntityManager();
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
    Root<Person> root = criteria.from(Person.class);
    System.out.println(root.get(column) == null); //InvocationTargetException
}

这是应该做的吗?如何将SingularAttribute对象作为参数传递给方法?


问题答案:

HibernateUtil.getEntityManager()在方法调用之前先以某种方式调用main。
当我从字面上调用方法的空块时,它甚至可以工作init() 它可能与类的初始化有关。这是代码片段。

public class HibernateUtil {
    private static EntityManagerFactory emFactory;
    private static EntityManager em;
    private static final Logger log = LoggerFactory.getLogger(HibernateUtil.class);
    private static final String PERSISTENCE_UNIT = "pt";
    static{
        log.info("Creating entity manager factory");
        emFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
    }
    //calling this from main before PersonDao's method calls somehow works...
    public void init(){} //does nothing
    public static EntityManager getEntityManager(){
        if(em != null && em.isOpen()){
            closeEntityManager();
        }
        log.debug("Creating new entity manager");
        em = emFactory.createEntityManager();
        return em;
    }
    public static void close() throws Exception {
        if(em != null && em.isOpen()){
            closeEntityManager();
        }
        log.info("Closing entity manager factory");
        emFactory.close();
    }
    private static void closeEntityManager(){
        log.info("Closing last entity manager");
        em.close();
    }
}


 类似资料:
  • 我试图在Hibernate 5.0.7中使用JPA2类型安全标准查询。最终的 根。get always throw。的元模型类由。 在JPA/HiberNate静态元模型属性不填充-NullPointerExctive中也遇到了类似的问题,但是这次两个类都在同一个包中。 堆栈跟踪: 我的代码: 我用来确保它们将具有

  • 问题内容: 根据文档,hibernate3.6应该支持java.util.UUID类型。但是当我像这样映射时: 我得到以下异常: 我知道带有堆栈跟踪的问题不是很流行,但这是一个非常hibernate的问题,我一直无法在Google上找到任何东西:) 谢谢 问题答案: UUID是3.6中添加的基本类型。但是,默认情况下,它转换为JDBC Binary类型,这似乎导致mysql问题。您可以通过显式指定

  • 下面是我在启动服务后看到的日志中的错误…您能帮助解决此问题吗。

  • 我试图访问选择参数设置的这个构建是参数化在一个Groovy构建脚本,为一个Jenkins自由式工作。 我尝试将列表用作,但它不起作用,并给出了以下输出: 我在Stackoverflow上引用了其他类似的帖子,但似乎没有什么对我有用。我还尝试了

  • A.我做的步骤 > 在index.js中添加管理员权限 映射意图 创建函数ffVisaCountry B.我的代码 C.我试着遵循交替论证。 用常量和var替换let D.代理人的预期和实际行为 预期行为:FF回复:{用户键入的国家名称} 实际行为:FF回复:[对象]

  • 如果我没有使用spring构建图形,那么是否可以使用spring框架完全访问我的neo4j图形?我正在尝试一些示例,但它似乎无法正常工作,因为spring创建的某些元数据不存在。 编辑:例如,我有这个错误当我试图通过它的id访问一个节点时,即