Hibernate引发NullPointerException-processFkSecondPassInOrder

发布于 2021-02-01 12:40:44

有人看过此消息吗?

在Hibernate论坛上进行了一些讨论,但对于问题可能是什么却不太清楚。

我们正在使用JPA和Spring 3.0.5运行Hibernate
3.6.9。这个异常只是在两个版本之间弹出(就像一天前一样,今天在部署时会引起问题)。这可能与某些错误配置的orm文件有关吗?我们为模型提供了orm.xml文件,为命名查询提供了文件。

Caused by: java.lang.NullPointerException
    at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1481)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1419)
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375)
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1519)
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1100)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:689)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:225)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:308)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
关注者
0
被浏览
139
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

    因此,我们发现了问题。不幸的是,当Hibernate无法找到FK时不会抛出一些标准的配置异常,例如“嘿,假人,我找不到您在orm文件中定义的FK”。

    我们在相同的schema / db下有两个对象:

    class Person {
      Long id;
      String name;
      Address address;
      ...
    }
    

    因此,Address对象是一对一的,作为复合键的一部分存在:

    <?xml version="1.0" encoding="UTF-8"?>
    <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
      http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
      version="2.0">
         <description>com.foo.Person Entity Mapping</description>
         <package>com.foo</package>
         <schema>COMMON</schema>
         <access>FIELD</access>
         <entity class="com.foo.Person" access="FIELD" metadata-complete="true">
            <table name="PERSON"/>
                <attributes>
                    <embedded-id name="id"/>
                    <basic name="name">
                            <column name="NAME"/>
                    </basic>
                </attributes>
         </entity>
         <embeddable class="com.foo.Person$Id" access="FIELD">
            <attributes>
            ...
            <one-to-one name="address" fetch="LAZY" target-entity="com.foo.Address" >
                <join-column name="ADDR_CD" insertable="false" updatable="false"/>
                <cascade>
                    <cascade-all/>
                </cascade>
            </one-to-one>
            </attributes>
         </embeddable> 
    </entity-mappings>
    

    问题在于我们将Address对象移至另一个数据库上的另一个模式,并将关系保留在orm文件中(因此,Address在复合键中仍然是一对一的)。

    为了解决这个问题,我们断开了关系,使Address变为瞬态,以便我们以另一种方式检索它,从而消除了异常的发生。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看