繁体   English   中英

Hibernate JPA orm.xml映射-java.lang.RuntimeException:试图实例化具有未知元素的接口javax.persistence.Table

[英]Hibernate JPA orm.xml mapping - java.lang.RuntimeException: Trying to instanciate interface javax.persistence.Table with unknown elements

我正在使用Spring 4.2.2.RELEASE休眠5.0.2.Final开发一个项目,并将其部署在jboss应用服务器7.1.1上。 我必须使用jboss进行部署,这是硬性要求。

我不想使用注释来配置JPA实体(这是一个硬要求),因此我定义了一个orm.xml文件映射。

<?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>OR Mapping</description>
    <persistence-unit-metadata>
        <xml-mapping-metadata-complete />
    </persistence-unit-metadata>
    <mapped-superclass class="com.lba.backend.rest.models.IdentifiableEntity">
        <attributes>
            <id name="id" />
        </attributes>
    </mapped-superclass>

    <entity class="com.company.rest.models.User">
        <table name="MyUser" />
        <attributes>
            <id name="id" />
            <basic name="username" />
            <basic name="firstName" />
            <basic name="lastName" />
            <basic name="image" />
        </attributes>
    </entity>

定义此映射后,将war文件部署到jboss 7.1.1应用服务器时,服务器启动时出现异常。

我什至查看了休眠源代码,这是引发异常的行AnnotationProxy#L87-89

if ( processedValuesFromDescriptor != descriptor.numberOfElements() ) {
            throw new RuntimeException( "Trying to instanciate " + annotationType + " with unknown elements" );
        }

当我从xml文件中删除表格元素时,它可以正常工作,但会抛出相同的异常

<join-column name="roleId" insertable="false" updatable="false" />

我为控制器和服务编写了Junit4测试用例,但这种情况并没有发生。 我使用spring mvc测试框架使用SpringJUnit4ClassRunner类编写单元测试。

有人知道我为什么要得到这个例外吗?

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/backend-rest-1.0]] (MSC service thread 1-2) Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myEmf' defined in ServletContext resource [/WEB-INF/application-context.xml]: Invocation of init method failed; nested exception is java.lang.RuntimeException: Trying to instanciate interface javax.persistence.Table with unknown elements
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) [spring-beans-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) [spring-beans-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) [spring-beans-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) [spring-beans-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) [spring-beans-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) [spring-beans-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) [spring-beans-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1048) [spring-context-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:825) [spring-context-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) [spring-context-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) [spring-web-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) [spring-web-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) [spring-web-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_79]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_79]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_79]
Caused by: java.lang.RuntimeException: Trying to instanciate interface javax.persistence.Table with unknown elements
    at org.hibernate.annotations.common.annotationfactory.AnnotationProxy.getAnnotationValues(AnnotationProxy.java:88) [hibernate-commons-annotations-5.0.0.Final.jar:5.0.0.Final]
    at org.hibernate.annotations.common.annotationfactory.AnnotationProxy.<init>(AnnotationProxy.java:69) [hibernate-commons-annotations-5.0.0.Final.jar:5.0.0.Final]
    at org.hibernate.annotations.common.annotationfactory.AnnotationFactory.create(AnnotationFactory.java:80) [hibernate-commons-annotations-5.0.0.Final.jar:5.0.0.Final]
    at org.hibernate.annotations.common.annotationfactory.AnnotationFactory.create(AnnotationFactory.java:53) [hibernate-commons-annotations-5.0.0.Final.jar:5.0.0.Final]
    at org.hibernate.cfg.annotations.reflection.JPAOverriddenAnnotationReader.getTable(JPAOverriddenAnnotationReader.java:2780) [hibernate-core-5.0.2.Final.jar:5.0.2.Final]
    at org.hibernate.cfg.annotations.reflection.JPAOverriddenAnnotationReader.initAnnotations(JPAOverriddenAnnotationReader.java:345) [hibernate-core-5.0.2.Final.jar:5.0.2.Final]
    at org.hibernate.cfg.annotations.reflection.JPAOverriddenAnnotationReader.isAnnotationPresent(JPAOverriddenAnnotationReader.java:314) [hibernate-core-5.0.2.Final.jar:5.0.2.Final]
    at org.hibernate.annotations.common.reflection.java.JavaXAnnotatedElement.isAnnotationPresent(JavaXAnnotatedElement.java:60) [hibernate-commons-annotations-5.0.0.Final.jar:5.0.0.Final]
    at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.categorizeAnnotatedClass(AnnotationMetadataSourceProcessorImpl.java:115) [hibernate-core-5.0.2.Final.jar:5.0.2.Final]
    at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.<init>(AnnotationMetadataSourceProcessorImpl.java:104) [hibernate-core-5.0.2.Final.jar:5.0.2.Final]
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.<init>(MetadataBuildingProcess.java:147) [hibernate-core-5.0.2.Final.jar:5.0.2.Final]
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:141) [hibernate-core-5.0.2.Final.jar:5.0.2.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:770) [hibernate-entitymanager-5.0.2.Final.jar:5.0.2.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:797) [hibernate-entitymanager-5.0.2.Final.jar:5.0.2.Final]
    at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:135) [hibernate-entitymanager-5.0.2.Final.jar:5.0.2.Final]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343) [spring-orm-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) [spring-orm-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) [spring-beans-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) [spring-beans-4.2.2.RELEASE.jar:4.2.2.RELEASE]
    ... 20 more

21:39:25,475 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-2) Error listenerStart
21:39:25,476 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-2) Context [/backend-rest-1.0] startup failed due to previous errors
21:39:25,488 INFO  [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/backend-rest-1.0]] (MSC service thread 1-2) Closing Spring root WebApplicationContext
21:39:25,498 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC00001: Failed to start service jboss.web.deployment.default-host."/backend-rest-1.0": org.jboss.msc.service.StartException in service jboss.web.deployment.default-host."/backend-rest-1.0": JBAS018040: Failed to start context
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:95)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_79]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_79]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_79]

Syed,正如您所发布的链接所暗示的那样,问题在于混合了JPA 2.0和JPA 2.1库。 您的测试可能正在工作,因为在类路径上首先显示了2.1库。 在您的应用服务器上,首先显示2.0库(可能是hibernate-jpa-2.0-api),您会​​收到错误消息

我有同样的问题,但设置不同。 我的解决方案是从pom.xml中排除对旧的hibernate-jpa-2.0-api lib的传递依赖:

<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-jpa-codegen</artifactId>
    <version>4.1.2</version>
    <exclusions>
        <exclusion>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM