Java 如何为hibernate拦截器使用单会话工厂

Java 如何为hibernate拦截器使用单会话工厂,java,hibernate,spring-mvc,interceptor,Java,Hibernate,Spring Mvc,Interceptor,我正在将Hibernate拦截器与(Hibernate 4.x)一起使用。我想对会话的save方法执行一些操作。所以我扩展了EmptyInterceptor 它有以下几种方法: onSave() //when save operation is preformed. postFlush() //called after committed into database 问题:在postFlush()中,我想执行保存操作。所以我的控制卡在回路中。因为在调用inver session.save()

我正在将Hibernate拦截器与(Hibernate 4.x)一起使用。我想对会话的save方法执行一些操作。所以我扩展了EmptyInterceptor

它有以下几种方法:

onSave() //when save operation is preformed.
postFlush() //called after committed into database 
问题:在postFlush()中,我想执行保存操作。所以我的控制卡在回路中。因为在调用inver session.save()时,调用了EmptyInterceptor的onSave()和postFlush()方法来拦截save操作

为了解决这个问题,我使用了两个会话工厂。1用于执行会话操作(保存、更新等),2用于HibernateIntercepter

但是我很担心如何用单会话工厂解决这个问题

公共类AudioGinterCeptor扩展了EmptyInterceptor{

public boolean onSave(Object entity, Serializable id, Object[] state,
        String[] propertyNames, Type[] types) {
    return false;
}

// called after committed into database
public void postFlush(Iterator iterator) {
    // want to perform SAVE operation here with Session.save()
    // But whenever I open new seesion here. It falls in loop
    Session tempSession = HibernateUtil.hibernateTemplateLog
            .getSessionFactory().openSession();

    try {
        Item item = new Item();
        item.setName("anyItem");
        item.setValue("anyValue");
        tempSession.save(item);
        tempSession.flush();
    } finally {
        tempSession.close();
    }
    }
} 

您不使用拦截器保存对象。您使用拦截器修改/格式化项目,并让会话对象为您的项目执行其余操作,但不添加新项目

如果您真的想在flush()或commit()的末尾添加一行,那么您可以使用Spring AOP作为一个选项来执行此操作。在这里,您可以向hibernate服务添加建议,这样,您可以在运行方法后立即保存一些内容

解决问题我认为如下所示

public void postFlush(Iterator iterator) {


for(; iterator.hasNext();) {
   if(!(iterator.next() instanceof Item)){ //<<<<< You verify if you are saving Item or //other objects, if saving Item, skip this block.

   Session tempSession = HibernateUtil.hibernateTemplateLog
            .getSessionFactory().openSession();

    try {
        Item item = new Item();
        item.setName("anyItem");
        item.setValue("anyValue");
        tempSession.save(item);
        tempSession.flush();
    } finally {
        tempSession.close();
    }
}
}
    }
} 
public void postFlush(迭代器迭代器){
for(;iterator.hasNext();){

如果(!(iterator.next()instanceof Item)){//实际上我正在使用hibernate拦截器进行审核日志记录。这意味着无论何时有任何保存或更新操作,我的拦截器都会选中该方法,并在审核日志表中插入一条新记录(关于实体的信息。它以前是什么以及当前是什么)。这是参考代码。在您提到的示例链接中,作者将拦截器绑定到特定会话,因此,如果他确实保存或更新了拦截器,则不会出现循环问题。您是否将其绑定到会话?或者您是否将拦截器应用到整个应用程序?如果您申请了会话,则请查看工作流程在我前面提到的一轮中,识别处于后期刷新中的对象,如果它是AuditLog对象,则跳过Audit保存块,这样,将不会调用后续保存,避免程序进入循环。您能告诉我如何将侦听器绑定到会话吗?我在sessionfactory上找不到将连接作为参数的方法t在该示例中,请参见步骤7。示例:。另外,为什么要查找连接参数?我仍然无法使其发生。问题仍然存在。但我只是添加了解决方法并使用了两个会话工厂:一个用于我的hibernate操作,另一个用于审核日志记录操作(我在其中传递了侦听器类引用).但我知道这不是一个好的选择,我真的希望只使用一个会话工厂,并希望将我的拦截器与单个会话绑定。