当前位置: 首页 > 知识库问答 >
问题:

HiberNate/JPA-NullPointerExctive当访问SingularAtCOM参数时

路扬
2023-03-14

我试图在Hibernate 5.0.7中使用JPA2类型安全标准查询。最终的

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

根。get always throwNullPointerExceptionPerson的元模型类Personorg生成。冬眠杰帕莫代尔根。JPAMetaModelEntityProcessor

在JPA/HiberNate静态元模型属性不填充-NullPointerExctive中也遇到了类似的问题,但是这次两个类都在同一个包中。

堆栈跟踪:

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 entitymanager 5.0.7。最终的

Postgresql9.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

但是方法中包含的相同代码会抛出NullPointerExctive

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;
}

因此,问题似乎是将SingularAt缴税参数传递给方法readBy(SingularAt缴税列,字符串值)

我在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

同时,这会在根目录下抛出由NullPointerException引起的InvocationTargetException。获取(列)

//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
}

这是它应该做的吗?我怎么能把SingularAtalty对象作为参数传递给一个方法?


共有1个答案

堵凯
2023-03-14
匿名用户

正在调用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.Final使用JPA2类型安全的条件查询。 root.get总是抛出异常。元模型类用于通过产生。 在未填充的JPA /Hibernate静态元模型属性中提出了类似的问题-NullPointerException,但这一次这两个类位于同一包中。 堆栈跟踪: 我的代码: 我用来确保它们将具有的接口。 模型类 生成的元模型Person_类 我随Pe

  • 我想发送我的(在AngularJS控制器中)设置参数如下: 但是我不确定这是否是正确的方法,在Node.js中写什么:

  • 我正在从事一个门户项目,在那里我被迫使用WebSpherePortal、SpringPortlet MVC和Hibernate。我在配置Spring和Hibernate方面没有太多经验,因此非常感谢您提供的各种帮助 我在WebSphere 7.0.0.25(安装了Portal 6.1)上创建了一个JDBC数据源,JNDI名称为JDBC/eshop。然后我指定JAAS身份验证别名,并将其设置为容器管

  • 23.7 访问程序参数 如果需要访问传递给SpringApplication.run(…)方法的程序参数,您可以注入一个org.springframework.boot.ApplicationArgumentsbean。ApplicationArguments接口提供对原始String[]参数以及被解析的option和non-option参数的访问: import org.springframew

  • 我无意中发现我可以在对象上保留更改,即使我没有在事务中写入它们。我想知道这是怎么发生的,因为理论上,如果我不在事务中写入更改,我应该无法更改数据库中的年龄值。PS:如果我删除最后2行,它不会像预期的那样对db产生任何影响。

  • 问题内容: 我想知道我需要做什么才能访问数据库线程安全。 这是我的Entity类: 这是DbService类: 这是与DbService一起使用的类: 使 add() , delete() , update() 和 getAll() 方法同步是否足够? 是否可以像在源代码中那样创建DbService的多个实例?还是只需要创建一个实例? 也许我应该使用单例设计模式?还是使DbService静态所有方