有人看过此消息吗?
在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无法找到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对象移至另一个数据库上的另一个模式,并将关系保留在orm文件中(因此,Address在复合键中仍然是一对一的)。
为了解决这个问题,我们断开了关系,使Address变为瞬态,以便我们以另一种方式检索它,从而消除了异常的发生。