2013-11-07 5 views
2
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 

Исключения в потоке "основной" org.hibernate.MappingException: Неизвестный объект: project.databaseio.TestClass $ 1Hibernate неизвестную ошибка объекта при сохранении нового объекта

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-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> 
+0

Пожалуйста, пост трассировки стека – kark

+0

@kark отправил (недостаточно символов) – Preston

ответ

4

Проблема исходит из следующей строки:

s = new Student(){{setFirstName("asdf");setLastName("asdf1");}}; 

Кратко эта строка создает новый экземпляр внутреннего класса, который неявно наследует от класса Student. Этот класс называется TestClass$1 компилятором Java, и поскольку для этого нет сопоставления, Hibernate жалуется на это. Что вам нужно сделать, это:

s = new Student(); 
s.setFirstName("blah"); 
s.setLastName("blah2"); 
s.setSchool((School) db.getByID(School.class, 1)); 
+0

Это билет, спасибо! FYI, TestClass - это имя класса, в котором все это выполнялось внутри. Так вот, вот что получилось, и 1 доллар был привязан jvm. Благодарю. – Preston

0

Объявление вашей организации Student представляется неправильным. Если вы используете аннотации, тогда должным образом аннотируйте аннотацию вашего класса @javax.persistence.Entity.

+0

Прошу прощения, какой класс? Я не уверен, что вы просите меня аннотировать переменную «s» или фактический класс Student или тестовый класс, который я использую? – Preston

+0

@Preston Студенческий класс –

+0

Добавлен «@Entity Публичный класс Студент {« в соответствии с документами здесь http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html Также попробовал это с @ javax.persistence.Entity - это то же самое. Он по-прежнему вызывает ошибку, не следует ли об этом аннотации отвечать конфигурационными файлами hbm для каждого объекта? – Preston

0

я столкнулся с подобной проблемой, где мое затмение попавшей проблемы версии с Java и не смог построить код, когда я добавил новую запись в моей сущности hibernate.cfg.xml он не обновил старый, и поэтому, когда спящий режим пытается найти объект, он не сможет его получить.

Я решил его, удалив старый hibernate.cfg.xml в моем бен месте рабочей области, а затем вставить новый hibernate.cfg.xml и лото он работал ..

Смежные вопросы