【问题标题】:Spring Hibernate Mapping IssueSpring Hibernate 映射问题
【发布时间】:2014-03-10 11:15:54
【问题描述】:

因为我是 Hibernate 和映射的新手。我无法找到这个原因的确切问题。当我找出问题的确切原因时,我会更新问题标题。运行 spring 项目时出现以下错误。 hbm.xml 是从 JBoss Hibernate 工具生成的。 (我会的)

下面给出了堆栈跟踪

    Mar 10, 2014 4:28:05 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@a4c4a0d: display name [org.springframework.context.support.ClassPathXmlApplicationContext@a4c4a0d]; startup date [Mon Mar 10 16:28:05 IST 2014]; root of context hierarchy
    Mar 10, 2014 4:28:05 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [config/beanLocations.xml]
    Mar 10, 2014 4:28:05 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [database/dataSource.xml]
    Mar 10, 2014 4:28:05 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [database/hibernate.xml]
    Mar 10, 2014 4:28:21 PM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
    INFO: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@a4c4a0d]: org.springframework.beans.factory.support.DefaultListableBeanFactory@5152a09f
    Mar 10, 2014 4:28:21 PM org.springframework.core.io.support.PropertiesLoaderSupport loadProperties
    INFO: Loading properties file from class path resource [properties/hibernate.properties]
    Mar 10, 2014 4:28:21 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
    INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@5152a09f: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,dataSource,sessionFactory,transactionManager,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,aneurismLocationDAO,annotationDAO,appUserDAO,deviceDAO,deviceManufacturerDAO,jobDAO,patientDAO,resourceDAO,roleDAO,strategyDAO,surgeryDAO,surgeryDeviceDAO,userRoleDAO]; root of factory hierarchy
    Mar 10, 2014 4:28:21 PM org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName
    INFO: Loaded JDBC driver: com.mysql.jdbc.Driver
    37 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.5.5-Final
    39 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found
    43 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
    47 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
    17632 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.Resource -> resource
    28298 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.Device -> device
    40931 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.AneurismLocation -> aneurism_location
    43487 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.Strategy -> strategy
    46348 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.Job -> job
    48916 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.SurgeryDevice -> surgery_device
    51356 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.UserRole -> user_role
    54070 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.Surgery -> surgery
    56434 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.Annotation1 -> annotation
    58732 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.Patient -> patient
    61120 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.Role -> role
    63747 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.DeviceManufacturer -> device_manufacturer
    66318 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.e.models.AppUser -> app_user
    Mar 10, 2014 4:29:28 PM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
    INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@5152a09f: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,dataSource,sessionFactory,transactionManager,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,aneurismLocationDAO,annotationDAO,appUserDAO,deviceDAO,deviceManufacturerDAO,jobDAO,patientDAO,resourceDAO,roleDAO,strategyDAO,surgeryDAO,surgeryDeviceDAO,userRoleDAO]; root of factory hierarchy
    Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [database/hibernate.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Association references unmapped class: org.e.models.Annotation
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:423)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
        at Application.main(Application.java:23)
    Caused by: org.hibernate.MappingException: Association references unmapped class: org.endovantage.models.Annotation
        at org.hibernate.cfg.HbmBinder.bindCollectionSecondPass(HbmBinder.java:2473)
        at org.hibernate.cfg.HbmBinder$CollectionSecondPass.secondPass(HbmBinder.java:2752)
        at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66)
        at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1221)
        at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1206)
        at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:673)
        at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
        ... 15 more

我的模型位于另一个 maven 模块中。

这是注解 hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Mar 5, 2014 5:28:21 PM by Hibernate Tools 4.0.0 -->
<hibernate-mapping>
    <class name="org.e.models.Annotation1" table="annotation" catalog="endo">
        <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="identity" />
        </id>
        <many-to-one name="resource" class="org.e.models.Resource" fetch="select">
            <column name="resource_id" not-null="true" />
        </many-to-one>
        <property name="XPoint" type="java.lang.Integer">
            <column name="x_point" />
        </property>
        <property name="YPoint" type="java.lang.Integer">
            <column name="y_point" />
        </property>
        <property name="ZPoint" type="java.lang.Integer">
            <column name="z_point" />
        </property>
        <property name="comment" type="string">
            <column name="comment" length="65535" />
        </property>
    </class>
</hibernate-mapping>

这是我的 Annotation1 模型(我将 Annotation 更改为 Annotation1 以检查天气,这是问题所在。)

   package org.e.models;

public class Annotation1 implements java.io.Serializable {

    private static final long serialVersionUID = 2037771233820433553L;
    private Long id;
    private Resource resource;
    private Integer XPoint;
    private Integer YPoint;
    private Integer ZPoint;
    private String comment;

    public Annotation1() {
    }

    public Annotation1(Resource resource) {
        this.resource = resource;
    }

    public Annotation1(Resource resource, Integer XPoint, Integer YPoint,
            Integer ZPoint, String comment) {
        this.resource = resource;
        this.XPoint = XPoint;
        this.YPoint = YPoint;
        this.ZPoint = ZPoint;
        this.comment = comment;
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Resource getResource() {
        return this.resource;
    }

    public void setResource(Resource resource) {
        this.resource = resource;
    }

    public Integer getXPoint() {
        return this.XPoint;
    }

    public void setXPoint(Integer XPoint) {
        this.XPoint = XPoint;
    }

    public Integer getYPoint() {
        return this.YPoint;
    }

    public void setYPoint(Integer YPoint) {
        this.YPoint = YPoint;
    }

    public Integer getZPoint() {
        return this.ZPoint;
    }

    public void setZPoint(Integer ZPoint) {
        this.ZPoint = ZPoint;
    }

    public String getComment() {
        return this.comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

}

这是我的 DAO 实现

    package org.e.persistance.dao.impli;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.e.models.Annotation1;
import org.e.persistance.dao.Annotation1DAO;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository("annotation1DAO")
public class Annotation1DAOImpli implements Annotation1DAO {

    private static final Log log = LogFactory.getLog(Annotation1DAOImpli.class);

    @Autowired
    private SessionFactory sessionFactory;

    public void persist(Annotation1 transientInstance) {
        log.debug("persisting Annotation1 instance");
        try {
            sessionFactory.getCurrentSession().persist(transientInstance);
            log.debug("persist successful");
        } catch (RuntimeException re) {
            log.error("persist failed", re);
            throw re;
        }
    }


    public void delete(Annotation1 persistentInstance) {
        log.debug("deleting Annotation1 instance");
        try {
            sessionFactory.getCurrentSession().delete(persistentInstance);
            log.debug("delete successful");
        } catch (RuntimeException re) {
            log.error("delete failed", re);
            throw re;
        }
    }

    public Annotation1 merge(Annotation1 detachedInstance) {
        log.debug("merging Annotation1 instance");
        try {
            Annotation1 result = (Annotation1) sessionFactory.getCurrentSession()
                    .merge(detachedInstance);
            log.debug("merge successful");
            return result;
        } catch (RuntimeException re) {
            log.error("merge failed", re);
            throw re;
        }
    }

    public Annotation1 findById(java.lang.Long id) {
        log.debug("getting Annotation1 instance with id: " + id);
        try {
            Annotation1 instance = (Annotation1) sessionFactory
                    .getCurrentSession().get("Annotation1", id);
            if (instance == null) {
                log.debug("get successful, no instance found");
            } else {
                log.debug("get successful, instance found");
            }
            return instance;
        } catch (RuntimeException re) {
            log.error("get failed", re);
            throw re;
        }
    }


}

抱歉,内容太长了。我非常感谢您对此提供的帮助。

编辑:

休眠配置文件

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.2.xsd">

    <!-- Hibernate session factory -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

        <property name="dataSource">
            <ref bean="dataSource" />
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>

        <property name="mappingResources">
            <list>
                <value>/hibernate/Resource.hbm.xml</value>
                <value>/hibernate/Device.hbm.xml</value>
                <value>/hibernate/AneurismLocation.hbm.xml</value>
                <value>/hibernate/Strategy.hbm.xml</value>
                <value>/hibernate/Job.hbm.xml</value>
                <value>/hibernate/SurgeryDevice.hbm.xml</value>
                <value>/hibernate/UserRole.hbm.xml</value>
                <value>/hibernate/Surgery.hbm.xml</value>
                <value>/hibernate/Annotation1.hbm.xml</value>
                <value>/hibernate/Patient.hbm.xml</value>
                <value>/hibernate/Role.hbm.xml</value>
                <value>/hibernate/DeviceManufacturer.hbm.xml</value>
                <value>/hibernate/AppUser.hbm.xml</value>
            </list>
        </property>

    </bean>
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>

这是我的数据源配置

    <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>properties/hibernate.properties</value>
    </property>
</bean>

<bean id="dataSource" 
         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

</beans>

这是我的 bean 位置配置

    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <!-- Database Configuration -->
    <import resource="../database/dataSource.xml" />
    <import resource="../database/hibernate.xml" />
    <context:annotation-config />
    <context:component-scan base-package="org.endovantage" />
</beans>

谢谢

【问题讨论】:

  • 你可以发布你的休眠配置文件
  • @henrycharles 我已经添加了我的 hibernate.xml
  • 您的hibernate.xml 不是休眠配置文件。
  • @PeterRader 我将添加我正在使用的所有配置文件
  • 大家好,感谢您的大力帮助。它首先崩溃的原因是,hbm.xml 中的类不是完全合格的。在那之后,我得到了大多数人都提到了正确答案的错误。所以,我会为大家+1! :)

标签: java spring hibernate


【解决方案1】:

您需要添加对将org.e.models.Annotation1 映射到Hibernate.xmllike 的映射文件的引用

<session-factory>
    <mapping resource="org/e/models/Annotation1.hbm.xml" />
</session-factory>

【讨论】:

  • 我已将其添加到 hibernate.xml 中。请看编辑。并感谢您的快速回复
  • @Diode 它说有一个类 org.endovantage.models.Annotation 没有任何映射。这是 org.e.models.Annotation1 类的副本吗?
  • 是的,我到处查看是否有任何遗漏的注释类需要手动重命名。那么是导致问题的原因吗?
  • @Diode 检查包 org.endovantage.models 并在不需要时删除 Annotation.java
  • 我试图删除它,它变得更糟了。映射中有一对多关系:(
【解决方案2】:

我认为您缺少这一行:

<mapping resource="path/to/your/annotation.hbm.xml"></mapping>

在你的hibernate.cfg.xml中。

【讨论】:

  • 我没有使用 hibernate.cfg.xml 文件。我在关注this article。他没有包括在内。他定义了一个hibernate.xml,我认为它的内容相同。请参阅编辑。非常感谢
【解决方案3】:

您的“注释”类未映射。添加

 <value>/hibernate/Annotation1.hbm.xml</value>

如果不存在则创建文件。

【讨论】:

  • 好的,我从 Annotation 改为 Annotation1 因为我认为这是问题的原因。我会将所有内容都更改回来并再次检查。
猜你喜欢
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2021-06-28
  • 2011-07-31
  • 2021-10-24
  • 1970-01-01
相关资源
最近更新 更多