Hibernate抛出NullPointerException - processFkSecondPassInOrder

时间:2012-02-15 23:11:01

标签: 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)

3 个答案:

答案 0 :(得分:1)

所以我们发现了问题。很遗憾,当Hibernate无法找到FK时会抛出一些标准的配置异常,例如“Hey dummy,我找不到你在orm文件中定义的FK。”

我们在同一架构/ 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对象移动到另一个db上的另一个模式,并将关系保留在orm文件中(因此Address仍然是复合键中的一对一)。

为了解决这个问题,我们断开了关系并将地址设置为瞬态,以便我们以不同的方式检索它并删除发生的异常。

答案 1 :(得分:0)

我们确实遇到了同样的问题,但问题是从实体中提取接口时,eclipse重构确实用其他实体中的接口替换了实现的类名。

答案 2 :(得分:0)

刚刚经历过webapp A使用库B,我们从库B添加了一个依赖库C(即B.Foo与C.Bar有一个ManyToOne关系),但是webapp A的Hibernate配置没有t包括要扫描的包列表中的库C.结果:Hibernate不知道库C中的实体被引用。