gpt4 book ai didi

java - 如何将单个 sessionFactory 用于 hibernate 拦截器

转载 作者:行者123 更新时间:2023-11-29 08:52:51 25 4
gpt4 key购买 nike

我在 (hibernate 4.x) 中使用 Hibernate 拦截器。我想对 session 的保存方法执行一些操作。所以我扩展了 EmptyInterceptor。

它有以下方法:

onSave() //when save operation is preformed.
postFlush() //called after committed into database

问题:我想在 postFlush() 中执行保存操作。所以我的控制陷入了循环。因为无论何时调用 session.save() 我的调用,都会调用 EmptyInterceptor 的 onSave() 和 postFlush () 方法来拦截 SAVE 操作。

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

但我担心如何用单个 sessionFactory 解决这个问题??

公共(public)类 AudiLogInterceptor 扩展了 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();
}
}
}

最佳答案

您不使用拦截器来保存对象。您可以使用它来修改/格式化项目,让 session 对象为您完成剩下的工作,但不添加新项目。

如果你真的想在 flush() 或 commit() 的末尾添加一行,那么你可以使用 Spring-AOP 作为一个选项来做到这一点。在那里您可以将 Advises 添加到 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();
}
}
}
}
}

关于java - 如何将单个 sessionFactory 用于 hibernate 拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21827778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com