2
我已經擴展了EmptyInterceptor並且我想記錄一個新創建的實體id。在onSave方法中,Serializable id爲null,實體主鍵也爲null。我們使用hbm文件爲主鍵映射pojo類和生成器class =「identity」。hibernate攔截器的onsave方法使用null Serializable id
我已經擴展了EmptyInterceptor並且我想記錄一個新創建的實體id。在onSave方法中,Serializable id爲null,實體主鍵也爲null。我們使用hbm文件爲主鍵映射pojo類和生成器class =「identity」。hibernate攔截器的onsave方法使用null Serializable id
這是因爲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
在我的例子,我得到了ID爲onSave
方法本身。
那麼我如何獲得onSave方法中的實體主鍵 – 2014-09-03 09:47:18
查看我更新的答案。 – Chaitanya 2014-09-03 10:29:20