保存新对象时Hibernate未知实体错误 [英] Hibernate unknown entity error when saving new object
本文介绍了保存新对象时Hibernate未知实体错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Student s = (Student) db.getByID(Student.class,1);
s.setFirstName("Preston");
db.saveOrUpdate(s); <--Successful save
s = new Student(){{setFirstName("asdf");setLastName("asdf1");}};
s.setSchool((School) db.getByID(School.class, 1));
db.saveOrUpdate(s); <--Error occurs
线程main中的异常org.hibernate.MappingException:未知实体: project.databaseio.TestClass $ 1
Exception in thread "main" org.hibernate.MappingException: Unknown entity: project.databaseio.TestClass$1
public void saveOrUpdate(Object object)
{
Transaction tx = sessionFactory.getCurrentSession().beginTransaction();
sessionFactory.getCurrentSession().saveOrUpdate(object);
tx.commit();
}
堆栈跟踪
Exception in thread "main" org.hibernate.MappingException: Unknown entity: project.databaseio.TestClass$1
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:548)
at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1338)
at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:180)
at org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:487)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:84)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
at com.sun.proxy.$Proxy0.saveOrUpdate(Unknown Source)
at project.databaseio.DatabaseConnection.saveOrUpdate(DatabaseConnection.java:117)
at project.databaseio.TestClass.main(TestClass.java:21)
学生的Hibernate配置
Hibernate Config for Student
<hibernate-mapping>
<class name="project.databaseio.Student" table="Student" catalog="fblaem">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<many-to-one name="school" class="project.databaseio.School" fetch="select">
<column name="SchoolID" not-null="true" />
</many-to-one>
<property name="firstName" type="string">
<column name="FirstName" not-null="true" />
</property>
<property name="lastName" type="string">
<column name="LastName" not-null="true" />
</property>
<property name="middleName" type="string">
<column name="MiddleName" />
</property>
<property name="createDate" type="timestamp">
<column name="CreateDate" length="0" />
</property>
<set name="studentEventTeams" table="StudentEventTeam" inverse="true" lazy="true" fetch="select">
<key>
<column name="StudentID" not-null="true" />
</key>
<one-to-many class="project.databaseio.StudentEventTeam" />
</set>
</class>
</hibernate-mapping>
推荐答案
问题来自以下行:
s = new Student(){{setFirstName("asdf");setLastName("asdf1");}};
简而言之,此行创建一个内部类的新实例,该实例隐式地从学生
课程。这个类被Java编译器命名为 TestClass $ 1
,并且因为没有映射,Hibernate正在抱怨它。你需要做的是:
Briefly this line is creating a new instance of an inner class which implicitly inherits from Student
class. This class is named TestClass$1
by Java's compiler and because there is no mapping for that, Hibernate is complaining about it. What you need to do is:
s = new Student();
s.setFirstName("blah");
s.setLastName("blah2");
s.setSchool((School) db.getByID(School.class, 1));
这篇关于保存新对象时Hibernate未知实体错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文