2012-02-15 72 views
2

有没有人看过此消息?Hibernate抛出NullPointerException - processFkSecondPassInOrder

在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

您可以二进制搜索映射文件来查找导致问题的文件。 – Firo 2012-02-16 08:39:39

回答

1

所以我们发现了这个问题。不幸的是,当Hibernate无法找到像“嘿,dummy,我找不到你在orm文件中定义的FK”这样的FK时,没有引发一些标准的配置异常。

我们有相同的架构/ DB下两个对象:

class Person { 
    Long id; 
    String name; 
    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设置为Address,以便我们以不同的方式检索它并删除发生的异常。

0

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

0

刚刚经历了这个web应用程序使用过的库B,并且我们添加了从库B到库C的依赖关系(即B.Foo与C.Bar具有ManyToOne关系),但Web应用程序A的Hibernate配置没有将库C包含在要扫描的软件包列表中。结果:Hibernate不知道库C中的实体被引用。

相关问题