Я расширил EmptyInterceptor и хочу зарегистрировать вновь созданный идентификатор объекта. В методе onSave Serializable id равен null, а первичный ключ сущности также является нулевым. мы используем hbm-файл для сопоставления класса pojo и класса генератора = «identity» для первичного ключа.hibernate interceptor onsave метод с нулевым Serializable id
2
A
ответ
3
Это связано с тем, что EmptyInterceptor будет вызван до сохранения объекта.
Попробуйте использовать postFlush, где ID будет доступен.
Вот небольшой пример с Hibernate 4.3
:
Entity Student.java
@Entity
public class Student {
@Id
@GeneratedValue
private int id;
private String name;
}
Interceptor class: LogInterceptor.java
public class LogInterceptor extends EmptyInterceptor {
Session session;
public void setSession(Session session) {
this.session = session;
}
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) throws CallbackException {
System.out.println("Entered onSave : class - " + entity.getClass());
if (entity instanceof Student) {
Student s = (Student) entity;
System.out.println("class:" + entity.getClass() + " , id: "+s.getId());
}
return false;
}
public void postFlush(Iterator iterator) {
System.out.println("Entered postFlush");
while (iterator.hasNext()) {
Object obj = iterator.next();
if (obj instanceof Student) {
Student s = (Student) obj;
System.out.println("class:" + s.getClass() + " , id: "+s.getId());
}
}
}
public Session getSession() {
return session;
}
}
Code to test this:
Configuration configuration = new Configuration().setInterceptor(new LogInterceptor());
configuration.configure("hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
session.getTransaction().begin();
Student s1 = new Student();
s1.setName("Test");
session.save(s1);
session.getTransaction().commit();
Output:
Entered onSave : class - class Student
class:class Student , id: 1
Entered postFlush
class:class Student , id: 1
В моем примере я получил идентификатор в onSave
самого метода.
Смежные вопросы
- 1. Hibernate Interceptor не работает
- 2. Nhibernate Interceptor - Получить длину объекта OnSave
- 3. Hibernate Interceptor post insert
- 4. Hibernate Interceptor PostLoad
- 5. Перехватчик Hibernate onSave и onLoad возвращает null
- 6. Autowired to hibernate Interceptor
- 7. Запись не вставлена после перехватчика onSave()
- 8. GWT/Hibernate: java.lang.NoClassDefFoundError: org/hibernate/Interceptor
- 9. Hibernate и Serializable Entities
- 10. Hibernate entity serializable
- 11. Hibernate Interceptor - событие после загрузки
- 12. Получить сеанс Hibernate от Interceptor
- 13. Hibernate Interceptor/Listeners for HQL
- 14. Метод OnSave для работы с методом onload?
- 15. Что такое Hibernate Interceptor и proxyTargetClass
- 16. Hibernate, как использовать Interceptor вместе с getCurrentSession()?
- 17. Hibernate maps Timestamp as Serializable
- 18. Правильное использование псевдонимов таблицы в Hibernate Interceptor
- 19. Сохраняющиеся Serializable объекты в Hibernate
- 20. OnSave() (для любого лица, сохраненного с Hibernate/Spring Data Хранилищем)
- 21. Hibernate Auto Increment ID
- 22. Hibernate Один к одному id является нулевым, почему?
- 23. Hibernate Interceptor не получает измененную коллекцию элементов
- 24. Перехватчик Hibernate не работает
- 25. Hibernate 5: SessionFactory является нулевым
- 26. Hibernate интеграции с Struts2 - сессии является нулевым
- 27. NHibernate Interceptor не используется при сохранении
- 28. hibernate ID increment oracle
- 29. NHibernate Interceptor не работает
- 30. Что заменило метод clone (Serializable)
так как я могу получить первичный ключ сущности в методе onSave –
См. Мой обновленный ответ. – Chaitanya