Java 如何为hibernate拦截器使用单会话工厂
我正在将Hibernate拦截器与(Hibernate 4.x)一起使用。我想对会话的save方法执行一些操作。所以我扩展了EmptyInterceptor 它有以下几种方法: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()
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操作,另一个用于审核日志记录操作(我在其中传递了侦听器类引用).但我知道这不是一个好的选择,我真的希望只使用一个会话工厂,并希望将我的拦截器与单个会话绑定。