【问题标题】:Hibernate-Could not parse mapping document from input streamHibernate - 无法从输入流中解析映射文档
【发布时间】:2015-06-28 08:29:02
【问题描述】:

我已经构建了一个在服务器上运行的 java 应用程序(maven)。我使用 Eclipse Luna、Spring 4 和 Hibernate 4。当我运行它时,我有一个错误:

SEVERE: 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 'sessionFactory' defined in ServletContext resource [/WEB-INF//applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.InvalidMappingException: Could not parse mapping document from input stream
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:736)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5016)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5528)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from input stream
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3762)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueue(Configuration.java:3751)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3739)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1928)
at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:454)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:439)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
... 21 more
Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping com.hibernate.data.Person
at org.hibernate.cfg.Configuration$MappingsImpl.addClass(Configuration.java:2835)
at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:178)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3759)
... 31 more

在网上搜索类似的问题,我认为它是由于缺少一些hibernate依赖而发生的并添加了它们。但是它不起作用。现在,我没有想法!

我的项目在这里:https://github.com/fsel/Spring-Hibernate-JSF-MySQL-Eclipse-Integration/tree/master/Spring-Hibernate-JSF-MySQL-Example

任何帮助将不胜感激。 谢谢!

【问题讨论】:

    标签: java mysql eclipse spring hibernate


    【解决方案1】:

    Person Class 被加载了两次。

    Spring configuration - applicationContext.xml 文件中你有:

    <property name="mappingResources">
                <list>
                    <value>domain-classes.hbm.xml</value>
                </list>
            </property>
    

    同样在hibernate configuration - hibernate.cfg.xml 文件中你再次加载它:

    <mapping resource="domain-classes.hbm.xml"/>
    

    要解决此问题,只需从 Spring 配置文件或 Hibernate 配置文件中删除上述条目之一。

    【讨论】:

    • 我刚刚编辑了这两个文件,现在可以使用了。感谢您的回复!
    【解决方案2】:
    Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping com.hibernate.data.Person
    at org.hibernate.cfg.Configuration$MappingsImpl.addClass(Configuration.java:2835)
    at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:178)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3759)
    

    上述异常表明 com.hibernate.data.Person 存在重复映射

    您的hinernate.cfg.xml 有以下代码

    <hibernate-configuration>
    <session-factory>
    <!-- Database connection settings -->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/PERSONDB</property>
    <property name="hibernate.connection.username">fulden</property>
    <property name="hibernate.connection.password">secret_pass</property>
    <!-- SQL dialect -->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <!-- Specify session context -->
    <property name="hibernate.current_session_context_class">thread</property>
    <!-- Show SQL -->
    <property name="show_sql">true</property>
    <!-- Referring Mapping File -->
    <mapping resource="domain-classes.hbm.xml"/>
    </session-factory>
    </hibernate-configuration>  
    

    你的 applicationContext.xml 有以下代码

    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
    <!-- Enable Spring Annotation Configuration -->
    <context:annotation-config />
    <!-- Scan for all of Spring components such as Spring Service -->
    <context:component-scan base-package="com.spring.service"></context:component-scan>
    <!-- Create Data Source bean -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/PERSONDB" />
    <property name="username" value="fulden" />
    <property name="password" value="secret_pass" />
    </bean>
    <!-- Define SessionFactory bean -->
    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
    <list>
    <value>domain-classes.hbm.xml</value>
    </list>
    </property>
    <property name="configLocation">
    <value>classpath:hibernate.cfg.xml</value>
    </property>
    </bean>
    <!-- Transaction Manager -->
    <bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!-- Detect @Transactional Annotation -->
    <tx:annotation-driven transaction-manager="transactionManager" />
    </beans>
    

    如果您仔细观察这两个文件,您正在复制休眠映射资源

    在hibernate.cfg.xml中

    <mapping resource="domain-classes.hbm.xml"/>
    

    在 applicationContext.xml 中

    <property name="mappingResources">
        <list>
        <value>domain-classes.hbm.xml</value>
        </list>
        </property>
    

    解决方案: 从 applicatinContext.xml 文件中删除 mappingResources 属性应该可以解决您的问题

    谢谢

    【讨论】:

      【解决方案3】:

      Person 中没有没有参数的构造函数。

      Hibernate,以及通过反射创建对象的一般代码 Class.newInstance() 创建类的新实例。这 方法需要 public 无参数构造函数 才能 实例化对象。对于大多数用例,提供无参数 构造函数不是问题。

      来源:
      Why does Hibernate require no argument constructor?

      【讨论】:

      • 我在 Person 类中添加了一个无参数构造函数。但它仍然给出了同样的错误:/
      • @oddly 你之前已经在那里了。如果没有,Java 会创建一个默认构造函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 2015-05-11
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 2016-01-23
      相关资源
      最近更新 更多