java—hibernate中的“未知实体异常”

wvmv3b1j  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(350)

我正在从事hibernate3项目,并面临
“未知实体”异常
. 我拥有所有的类,这些类通过注解Map到表中。我已经在默认的“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.

休眠.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>

请注意,提供了所有数据连接条目,如
异常的堆栈跟踪:

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)
jqjz2hbq

jqjz2hbq1#

您的hibernate配置和实际类名中必须有输入错误。你所提供的一切

com.myproj.Student

以及

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

所以我猜你已经用手把它命名了,所以我怀疑你在真实的类名中也有类似的拼写错误。
我建议首先使用jpa2.*而不是普通的hibernate。您仍然可以使用它作为存在提供者。

ldxq2e6h

ldxq2e6h2#

您提到您使用的是Hibernate3,但不是哪个次要版本,所以我首先要指出一些可能有用的东西,因为您似乎还处于项目的早期阶段,可能有一些灵活性。不过,我的答案不会偏离Hibernate3的细节。
Hibernate3.2中添加了注解支持 AnnotationConfiguration 似乎是在Hibernate3.5中添加的(因此我假设您使用的是Hibernate3.5+) AnnotationConfiguration 在hibernate 3.6中已弃用,并且中提供了所有等效功能 Configuration 当前版本现在是hibernate 5.2.12
您在下面的一行中有一个输入错误,但我假设您的代码中没有这个错误,或者您将有一个编译错误而不是一个 MappingException :

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

我建议如下:
确认您的配置文件名 hibernate.cfg.xml 而且没有错别字
确认一下 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 ,因此我不必显式地提供路径。
为了简洁起见,您可能故意省略了xmldtd数据,我不知道这与 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();

相关问题