2016-09-23 82 views
1

我想拦截所有插入的实体。Hibernate拦截器帖子插入

onSave这是预插入实体和postFlush其中包含插入和更新实体。

如何通过Hibernate Interceptor获取后插入实体?

回答

0

有在休眠6个触发器太 1. PreInsert 2. PostInsert 3.更新前 4. PostUpdate 5. PreDelete 6. PostDelete

这些触发器的每个数据库调用后作为名称的状态操作。 现在你必须做的是确定这些触发器是休眠的SessionFactory的这样

private static SessionFactory buildSessionFactory(Properties props, 
     URL cfgUrl) { 

    Configuration configuration = new Configuration(); 
    configuration.configure(cfgUrl).addProperties(props); 

    serviceRegistry = new ServiceRegistryBuilder().applySettings(
      configuration.getProperties()).buildServiceRegistry(); 
    sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
    EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory) 
      .getServiceRegistry().getService(EventListenerRegistry.class); 
    registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener(
      new GrPreInsertEventListener()); 
    registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener(
      new GrPreUpdateEventListener()); 
    registry.getEventListenerGroup(EventType.MERGE).appendListener(
      new GrPreMergeEventListener()); 
    return sessionFactory; 
} 
+0

我可以在PostInsert事件中插入关联的实体吗?例如,当实体A正在插入时,插入实体B并关联到该实体A? 我试图在onSave里面做,但我得到了'org.springframework.dao.InvalidDataAccessApiUsageException:org.hibernate.TransientPropertyValueException:非空属性引用一个瞬态值 - 瞬态实例必须在当前操作之前保存。这就是为什么我在看'postFlush'方法。 – Stackle

+0

我认为它赢了;不成问题,但你必须尝试 –

0

既然你提到的Hibernate拦截器 - 您可以识别插入的说,例如onFlushDirty(...)如果前面状态具有空ID,前提是您不是手动分配ID,而是生成它们。