【问题标题】:Hibernate throwing NullPointerException - processFkSecondPassInOrder休眠抛出 NullPointerException - processFkSecondPassInOrder
【发布时间】:2012-02-15 23:11:01
【问题描述】:

以前有人看过这条消息吗?

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

【问题讨论】:

  • 您可以对映射文件进行二进制搜索以找到导致问题的文件。

标签: hibernate


【解决方案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 对象移动到另一个 db 上的另一个模式,并将关系留在 orm 文件中(因此 Address 在复合键中仍然是一对一的)。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      刚刚经历了 webapp A 使用库 B 的情况,我们添加了从库 B 到库 C 的依赖项(即 B.Foo 与 C.Bar 具有多对一关系),但 webapp A 的 Hibernate 配置没有t 在要扫描的包列表中包含库 C。结果:Hibernate 不知道库 C 中的实体被引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        • 2019-04-13
        • 2021-05-16
        • 1970-01-01
        • 1970-01-01
        • 2017-08-11
        相关资源
        最近更新 更多