Сломанный метод сохранения гибернации

У меня есть следующий метод на уровне DAO моего Java-приложения:

public void save(Employee emp) {
     System.out.println("emp type: " + emp.getClass().getName);
     getHibernateTemplate().save(emp);
     System.out.println("object saved!");
     System.out.flush();
}

Класс employee не наследуется ни от каких других классов и имеет следующий файл hbm:

<hibernate-mapping>    
 <class name="org.myCompany.Employee" table="employee">
 <!-- fields omitted to save space -->
</hibernate-mapping>

Однако вставка завершается с ошибкой java.lang.ClassCastException. Сначала я подумал, что с моим сопоставлением что-то не так (например, целочисленное сопоставление с логическим значением), но затем я включил отладку show_sql в спящем режиме и обнаружил следующее в своем файле журнала:

тип emp: org.myCompany.Employee
Hibernate: вставка в значения клиента (.......) (......)
java.lang.ClassCastException

Почему он выбрал совершенно случайную таблицу для вставки? Я уверен, что у меня неправильно настроен какой-то файл конфигурации, но я не знаю, какой именно. Я проверил следующее:

  • applicationContext-hibernate.xml -> объекты Customer и Employee сопоставляются с их правильными файлами hbm
  • ни Customer, ни Employee не имеют отношения наследования (нет даже общего родительского класса, такого как Person или User)

Что еще я мог попробовать?


person David    schedule 12.07.2010    source источник
comment
Покажите полную трассировку стека, пожалуйста.   -  person axtavt    schedule 12.07.2010


Ответы (1)


В вызывающем классе у меня есть следующие два вызова:

UserDAO.saveCustomer(customer);
UserDAO.saveEmployee(employee);

Я думал, что объект клиента сохраняется правильно. Я даже поместил оператор отладки между двумя вызовами и распечатал метод отладки. Однако закомментирование строки UserDAO.saveCustomer решило проблему. Это заставило меня более внимательно изучить объект клиента, и я обнаружил, что он поврежден (неправильный класс). Hibernate должен кэшировать оператор вставки, пока транзакция не будет завершена.

Так что теперь этот вопрос решен.

person David    schedule 12.07.2010
comment
Вы должны отредактировать свой вопрос, а не публиковать ответ, как правило - person Steven Schlansker; 12.07.2010