Hibernate中的“未知实体异常”

时间:2017-10-31 16:07:33

标签: java hibernate hibernate-mapping

我正在开发 Hibernate 3 项目并面向

  

'未知实体'例外

。我有所有类,并使用注释将它们映射到表。我已在默认的“ hibernate.cfg.xml ”文件中填写了所有必填项。

我收到一个'未知实体异常',并试图找出为什么我得到相同,即使我有所有必需的配置准确。

我已经为'@Entity'注释包含了正确的包,它是: 'javax.persistence.Entity'并且还在'hibernate.cfg.xml'文件中为条目'mapping class'提供了完整的类名。

有人知道什么是其他异常原因吗?

以下是实体类:

package com.myproj;
import java.io.serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name="STUDENT")
public class Student implements Serializable{
    @Id
    @Column(name="student_id")
    private Long studentId;

    @Column(name="student_name")
    private Long studentName;

    //getters and setters

}

创建SessionFactory的片段

SessionFactory sf;
Configuration config = new AnnotationConfiguration();
sf = config.configure().buidSessionFactory();

Student student = null;
Session session = sf.openSession();
student = (Student)session.get(Student.class, new Integer(1)); //Unknown Entity Exception thrown over here while trying to retrieve a Student with ID 1.

的hibernate.cfg.xml

<hibernate-configuration>
<session-factory>
    <!-- All the data connection entries are provided here -->
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <mapping class="com.myproj.Student" /> 
</session-factory>
</hibernate-configuration>

请注意,提供了所有数据连接条目

异常的Stacktrace:

org.hibernate.MappingException: Unknown entity: com.myproj.Student
org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:629)
org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:91)
org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:908)
org.hibernate.impl.SessionImpl.get(SessionImpl.java:845)
org.hibernate.impl.SessionImpl.get(SessionImpl.java:838)
com.myproj.StudentBean.search(StudentBean.java:50)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)

2 个答案:

答案 0 :(得分:0)

你的hibernate配置和实际的类名必须有拼写错误。在你提供的内容中

com.myproj.Student

<mapping class="com.proj.Student" /> 

所以我猜你已经手工制作了它,因此我怀疑你在真正的班级名字中有类似的拼写错误。

我建议首先使用JPA2。*保证普通的Hibernate。您仍然可以将其用作您的生存提供者。

答案 1 :(得分:0)

你提到你使用的是Hibernate 3,但没有使用哪个次要版本,所以我首先会指出一些可能有用的东西,因为它看起来你早在你的项目中并且可能有一些灵活性。但是,我的答案不会偏离Hibernate 3的细节。

  • 在Hibernate 3.2中添加了注释支持
  • AnnotationConfiguration似乎是Hibernate 3.5中的added(所以我假设您使用的是Hibernate 3.5 +)
  • AnnotationConfiguration在Hibernate 3.6中为deprecated,所有等效功能都出现在Configuration
  • 当前版本现在是Hibernate 5.2.12

您在下一行中有一个拼写错误,但我认为您的代码中不存在这种拼写错误,或者您会遇到编译错误而不是MappingException

sf = config.configure().buidSessionFactory();  
// should be sf = config.configure().buildSessionFactory();

我建议如下:

  • 确认您的配置文件名正好hibernate.cfg.xml且没有拼写错误
  • 确认您的CLASSPATH中有hibernate.cfg.xml
  • 您可以尝试明确指定hibernate.cfg.xml
  • 的路径

例如,

// Hibernate 3.5
sf = new AnnotationConfiguration()
        .configure("/path/to/hibernate.cfg.xml")
        .buildSessionFactory();

// Hibernate 3.6+
sf = new Configuration()
        .configure("/path/to/hibernate.cfg.xml")
        .buildSessionFactory();

例如,在我的项目中,我使用的是Maven,因此我的配置文件位于<path/to/project>/<project_name>/src/main/resources/hibernate.cfg.xml,因此我不必明确提供路径。

为简洁起见,您可能故意省略了XML DTD数据,但我不知道这与您正在查看的MappingException有什么关系,但要确保XML DTD在您的hibernate.cfg.xml文件中:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="...">...</property>
        <mapping class="..."/>
    </session-factory>
</hibernate-configuration>

以下内容对于<mapping />文件中的hibernate.cfg.xml元素来说是多余的,我对此建议犹豫不决,因为如果您没有获得<mapping />元素的解析hibernate.cfg.xml工作,您必须为要保留的任何和所有带注释的POJO执行此操作。但是,作为绝对的最后手段,您可以尝试addAnnotatedClass()

// Hibernate 3.5
sf = new AnnotationConfiguration()
        .addAnnotatedClass(Student.class)
        .configure()
        .buildSessionFactory();

// OR Hibernate 3.6+
sf = new Configuration()
        .addAnnotatedClass(Student.class)
        .configure()
        .buildSessionFactory();