java - 由 : org. hibernate.MappingException 引起:无法加载配置中声明为 <mapping class ="xxxxx"/> 的类:

标签 java spring hibernate

在我的 Spring Web 应用程序中,我在启动 Spring 应用程序时收到此错误

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 'transactionManager' defined in ServletContext resource [/WEB-INF/spring/data.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring/data.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Unable to load class declared as <mapping class="reshetyk.alexey.diary.domain.DiaryUser"/> in the configuration:

我还有第二个错误

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring/data.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Unable to load class declared as <mapping class="reshetyk.alexey.diary.domain.DiaryUser"/> in the configuration:

DiaryUser 类在包中定义,假设 getter 和 setter 定义良好,则具有以下属性

这是我的 DiaryUser class.java 实体类的完整代码

    @Entity
@Table(name = "USERS")
public class DiaryUser implements Serializable {

    @Id
    @Column(name = "ID_USER")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "LOGIN", unique = true, nullable = false)
    private String login;

    @Column(name = "PASSWORD", nullable = false)
    private String password;

    public DiaryUser() {
    }
    public DiaryUser(Integer id) {
        this.id = id;
    }

    public DiaryUser(String login) {
        this.login = login;
    }

    public DiaryUser(Integer id, String login, String password) {
        this.id = id;
        this.login = login;
        this.password = password;
    }

    public Integer getId() {
        return id;
    }

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

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

我在 hibernate.cfg.xml 文件中同样定义了这一点

<hibernate-configuration>
    <session-factory>
        <mapping class="reshetyk.alexey.diary.domain.DiaryUser" />
        <mapping class="reshetyk.alexey.diary.domain.DiaryCategory" />
        <mapping class="reshetyk.alexey.diary.domain.DiaryRecord" />
    </session-factory>
</hibernate-configuration>

这是我的 data.xml 文件,其中包含用于 hibernate 映射的数据库定义配置

<tx:annotation-driven transaction-manager="transactionManager" />


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


    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:messages" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>


    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="/WEB-INF/jdbc.properties" />


    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        p:driverClassName="${jdbc.driverClassName}" 
        p:url="${jdbc.databaseurl}"
        p:username="${jdbc.username}" 
        p:password="${jdbc.password}" />


    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.connection.charSet">UTF-8</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

我有点困惑,因为我不知道为什么会收到此错误?

最佳答案

不要使用 LocalSessionFactoryBean,而是尝试使用 AnnotationSessionFactoryBean 并指定映射类,如下所示(检查链接: AnnotationSessionFactoryBean )

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
   <property name="dataSource" ref="dataSource"/>
   <property name="annotatedClasses">
     <list>
       <value>test.package.Foo</value>
       <value>test.package.Bar</value>
     </list>
   </property>
 </bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
   <property name="dataSource" ref="dataSource"/>
   <property name="packagesToScan" value="test.package"/>
 </bean>

而不是在 hibernate.cfg.xml 下定义映射。

data.xml 文件中的 sessionFactory 详细信息可以修改如下:

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!--<property name="configLocation" value="classpath:hibernate.cfg.xml"/>-->
        <property name="annotatedClasses">
         <list>
           <value>reshetyk.alexey.diary.domain.DiaryUser</value>
           <value>reshetyk.alexey.diary.domain.DiaryCategory</value>
           <value>reshetyk.alexey.diary.domain.DiaryRecord</value>
         </list>
       </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.connection.charSet">UTF-8</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

关于java - 由 : org. hibernate.MappingException 引起:无法加载配置中声明为 <mapping class ="xxxxx"/> 的类:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37789024/

相关文章:

ArrayList处理中的java.util.ConcurrentModificationException

java - java中文件结尾的正则表达式?

spring - Grails -- 检查请求是否已经重定向

Java.lang 错误?

hibernate - JPA - 使用转换器保留 @Temporal LocalDate

java - ExecutorService 单线程执行器

java - Gradle:从自定义任务中调用 ant

java - 将 SimpleMessageListenerContainer 初始化为已停止

hibernate - 在 J2SE 中使用 JPA 2.0 @Cacheable 与 Spring、EHCache 和 Hibernate,无需 Hibernate 特定注释

java - HQL 查询未删除托管对象