一尘不染

Hibernate引发NullPointerException-processFkSecondPassInOrder

hibernate

有人看过此消息吗?

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

阅读 319

收藏
2020-06-20

共1个答案

一尘不染

因此,我们发现了问题。不幸的是,当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变为瞬态,以便我们以另一种方式检索它,从而消除了异常的发生。

2020-06-20