2014-09-03 83 views

回答

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 

在我的例子,我得到了ID爲onSave方法本身。

+0

那麼我如何獲得onSave方法中的實體主鍵 – 2014-09-03 09:47:18

+0

查看我更新的答案。 – Chaitanya 2014-09-03 10:29:20