Hibernate:无法加载在Hibernate配置< mapping/>条目中声明的类

4

我完全不懂Hibernate,遇到了以下的错误信息:

hql> from TracksEntity 
[2014-04-26 21:13:45] org.hibernate.MappingException: Unable to load class [ model.TracksEntity] declared in Hibernate configuration <mapping/> entry
[2014-04-26 21:13:45] java.lang.ClassNotFoundException: model.TracksEntity
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:259)
    at org.hibernate.internal.util.ReflectHelper.classForName(ReflectHelper.java:192)
    at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2188)
    at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2139)
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2119)
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2072)
    at org.hibernate.cfg.Configuration.configure(Configuration.java:2045)
    at com.intellij.hibernate.remote.impl.RemoteConfigurationImpl.configure(RemoteConfigurationImpl.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
    at sun.rmi.transport.Transport$1.run(Transport.java:178)
    at sun.rmi.transport.Transport$1.run(Transport.java:175)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:174)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:557)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:812)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:671)
    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:744)

我的 hibernate.cfg.xml 和 TracksEntity.java 都是由Intellij Idea自动生成的:

TracksEntity.java: package model;

import javax.persistence.*;

@Entity
@Table(name = "TRACKS", schema = "APP", catalog = "")
public class TracksEntity {
    private int id;
    private String artist;
    private int duration;
    private String title;
    private String url;

    @Id
    @Column(name = "ID")
    public int getId () {
        return id;
    }

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

    @Basic
    @Column(name = "ARTIST")
    public String getArtist () {
        return artist;
    }

    public void setArtist (String artist) {
        this.artist = artist;
    }

    @Basic
    @Column(name = "DURATION")
    public int getDuration () {
        return duration;
    }

    public void setDuration (int duration) {
        this.duration = duration;
    }

    @Basic
    @Column(name = "TITLE")
    public String getTitle () {
        return title;
    }

    public void setTitle (String title) {
        this.title = title;
    }

    @Basic
    @Column(name = "URL")
    public String getUrl () {
        return url;
    }

    public void setUrl (String url) {
        this.url = url;
    }

    @Override
    public boolean equals (Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        TracksEntity that = (TracksEntity) o;

        if (duration != that.duration) return false;
        if (id != that.id) return false;
        if (artist != null ? !artist.equals(that.artist) : that.artist != null) return false;
        if (title != null ? !title.equals(that.title) : that.title != null) return false;
        if (url != null ? !url.equals(that.url) : that.url != null) return false;

        return true;
    }

    @Override
    public int hashCode () {
        int result = id;
        result = 31 * result + (artist != null ? artist.hashCode() : 0);
        result = 31 * result + duration;
        result = 31 * result + (title != null ? title.hashCode() : 0);
        result = 31 * result + (url != null ? url.hashCode() : 0);
        return result;
    }
}

hibernate.cfg.xml:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.url">jdbc:derby:/home/zimy/Documents/drbdb;create=true;create=true</property>
        <property name="connection.driver_class">org.apache.derby.jdbc.EmbeddedDriver</property>
        <mapping class="model.TracksEntity"/>
    </session-factory>
</hibernate-configuration>

什么问题?我看到它未被找到,但为什么?
10个回答

7

听起来很傻,但我把实体类放在了一个与我放在映射中的不同的包里... 当然,Hibernate找不到它... 只是作为参考... 也许重新检查可以解决你的问题。祝一切顺利。


3
write in this pattern

 <session-factory>

    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/dairy
    </property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <property name="hibernate.connection.pool_size">10</property>
    <property name="show_sql">true</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.current_session_context_class">thread</property>

    <!-- MAPPING -->
    <!-- <mapping class="com.om.model.Test" /> -->
    <mapping class="com.om.model.RateCalculationBean" />

</session-factory>

同时也不需要提及schema


2
谢谢!将<property name="hibernate.current_session_context_class">thread</property>添加到hibernate.cfg.xml中使其正常工作。但这意味着什么?为什么我没有配置此属性时会出现java.lang.ClassNotFoundException:model.TracksEntity? - Zimy

2
当映射文件不能正确加载时,我遇到了类似的问题。解决这个问题的答案似乎是我们需要在我们的模型类中使用正确的导入语句。
在我的情况下,更改导入语句为import javax.persistence.Entity而不是使用来自Hibernate包的语句(即org.hibernate.annotations.Entity),解决了这个问题。
这个问题真的很痛苦,我花了半天时间查看所有角落,当一个简单的导入修复了问题。
希望这能有所帮助。

1

您可以通过两种方法来实现,第二种方法一定有效。

  1. 在hibernate.cfg.xml中添加映射条目即可使其工作。

<mapping class="com.sample.yourClass" />

  1. 在您的代码中,在创建Configuration对象之后,像这样添加类:
Configuration config = new Configuration();
config.addClass(com.sample.yourClass);

0
最近我遇到了这个问题。我检查了所有的东西,但没有找到可能引起它的原因。绝望之下,我只是把映射中的“/>”移到了更靠近的位置并保存了一下。然后它就奇迹般地解决了。神秘...

0

对我有用:

在 hibernate.cfg.xml 中更改映射标签的位置,针对之前未加载的类。

现在我把它放在顶部了。


0
在我的情况下,我刚刚重新部署了项目。然后问题得到解决!

0

我的错误是驼峰命名问题。我有一个嵌入式实体"IndexPK",但在映射文件中写成了"IndexPk"。我比较了大约20次......直到我弄清楚了这个问题。


0
我遇到了同样的问题, 添加了这个依赖后问题得到了解决。
    <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.1.GA</version>
    </dependency>

0

为解决此问题,请添加Maven Spring Boot依赖项

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <exclusions>
       <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
       </exclusion>
   </exclusions>

你怎么知道他们有一个Spring设置? - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接