2014-09-03 3 views
2

Я расширил EmptyInterceptor и хочу зарегистрировать вновь созданный идентификатор объекта. В методе onSave Serializable id равен null, а первичный ключ сущности также является нулевым. мы используем hbm-файл для сопоставления класса pojo и класса генератора = «identity» для первичного ключа.hibernate interceptor onsave метод с нулевым Serializable id

ответ

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 самого метода.

+0

так как я могу получить первичный ключ сущности в методе onSave –

+0

См. Мой обновленный ответ. – Chaitanya

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