之前有没有人看过这条消息?
在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 :(得分: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中的实体被引用。