我正在开发 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)
答案 0 :(得分:0)
你的hibernate配置和实际的类名必须有拼写错误。在你提供的内容中
com.myproj.Student
和
<mapping class="com.proj.Student" />
所以我猜你已经手工制作了它,因此我怀疑你在真正的班级名字中有类似的拼写错误。
我建议首先使用JPA2。*保证普通的Hibernate。您仍然可以将其用作您的生存提供者。
答案 1 :(得分:0)
你提到你使用的是Hibernate 3,但没有使用哪个次要版本,所以我首先会指出一些可能有用的东西,因为它看起来你早在你的项目中并且可能有一些灵活性。但是,我的答案不会偏离Hibernate 3的细节。
AnnotationConfiguration
似乎是Hibernate 3.5中的added(所以我假设您使用的是Hibernate 3.5 +)AnnotationConfiguration
在Hibernate 3.6中为deprecated,所有等效功能都出现在Configuration
您在下一行中有一个拼写错误,但我认为您的代码中不存在这种拼写错误,或者您会遇到编译错误而不是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
,因此我不必明确提供路径。
为简洁起见,您可能故意省略了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();