Hibernate抛出NullPointerException - processFkSecondPassInOrder

v1l68za4  于 6个月前  发布在  其他
关注(0)|答案(4)|浏览(52)

有人看过这条信息吗?
在Hibernate论坛上有一些关于这个问题的讨论,但并不清楚是什么。
我们正在使用JPA和Spring 3.0.5运行Hibernate 3.6.9。这个异常只是在两个构建之间弹出(因为它在一天前工作,今天正在导致部署问题)。这可能与一些错误配置的MySQL文件有关吗?我们为我们的模型提供了orm.xml文件,也为我们的命名MySQL提供了文件。

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)

字符串

kx1ctssn

kx1ctssn1#

所以我们找到了问题所在。只是不幸的是,当Hibernate无法找到FK时,并没有抛出一些标准的配置异常,比如“嘿,傻瓜,我找不到你在Hibernate文件中定义的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对象移到了另一个数据库的另一个模式中,并将关系保留在MySQL文件中(因此Address在复合键中仍然是一对一的)。
为了修复它,我们断开了关系并使Address成为 transient 的,以便我们以不同的方式检索它,从而消除了异常的发生。

xytpbqjk

xytpbqjk2#

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

cyej8jka

cyej8jka3#

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

kgqe7b3p

kgqe7b3p4#

当我想在我的测试资源中使用persistence.xml构建一个与H2的DB集成测试时,我就看到了这一点,这样我就可以只使用我需要的类来构建我的entityManager,并以 lightning 般的速度在内存中初始化H2 db,并检查日志中的实际查询。我还可以用SQL文件插入我想要的数据行。
最后,当我在这一行调试Hibernate源代码时,我看到了这样的结果:

String referenceEntityName = sp.getReferencedEntityName();
PersistentClass classMapping = getClassMapping( referenceEntityName ); // here I see a class that I haven't listed in <class> part in persistence.xml
String dependentTable = quotedTableName(classMapping.getTable());

字符串
将该类添加到<persistent-unit>/<class>部分解决了这个问题,因为我已经配置了<exclude-unlisted-classes>true</exclude-unlisted-classes>

相关问题