当前位置: 首页 > 知识库问答 >
问题:

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

哈烨熠
2023-03-14

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

它有以下几种方法:

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

问题:在postFlush()我想执行保存操作。所以我的控制卡在循环中。因为每当session.save()被调用我的调用时,空拦截器的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();
    }
    }
} 

共有1个答案

羊舌和安
2023-03-14

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

如果您真的想在flush()或commit()的末尾添加一行,那么可以使用SpringAOP作为一个选项。您可以在那里向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();
    }
}
}
    }
} 
 类似资料:
  • 问题内容: 如何在Hibernate拦截器中获取Hibernate会话? 我正在尝试使用Hibernate通过组织ID透明地强制执行数据访问。我设置了一个全局筛选器,以按组织ID筛选所有查询。现在,在保存/更新之前,我需要使用实体拦截器在所有实体上设置组织ID。 组织ID来自HttpSession 我已经在Hibernate会话中将Organizational Id设置为Filter属性,我想在我

  • 我使用Spring Boot v2.0.3和Hibernate 5.2。我想创建一个Hibernate拦截器,在我的一个实体字段中生成一个值,基于我数据库中的一个唯一数字,然后保存。 我获取了一些在线资源,并最终扩展了Hibernate空拦截器,以覆盖onSave方法。 在我的申请中。yml配置文件,我添加了以下键: 当我尝试保存票证时,我可以看到方法onSave被正确调用,但是由于拦截器完全由H

  • 问题内容: 我尝试了一些来自hibernate 4.0拦截器的 代码,该代码为使用会话级拦截器提供了以下代码: 但是,我同时检查了hibernate-core 4.0源代码和onliehibernate 4.0 java- doc ,该类没有方法,但是hibernate 3.6 java- doc确实具有此方法。 有人知道该方法移到哪里吗?如果已弃用,为什么文档仍将其保留在教程文档中?在4.0中如

  • 我们正在构建一个应用程序,我们需要将实体更新登录到历史表中。我试图通过Hibernate拦截器来实现这一点,我们可以设法获得所有的更改,但很难将它们插入审计表。 我的JPA配置 我的拦截器 } 在方法afterTransactionCompletion中,我需要将所有审计实体写入DB,Autowire不工作,因为这不是spring管理的bean,是否有任何方法可以在此方法中获取DB会话,以便我可以

  • 我正在尝试在eclipse中设置Hibernate Tools。问题是它找不到任何映射文件。 我创建了一个控制台配置,指向我的environment.properties文件和hibernate.cfg.xml.问题是hibernate.cfg.xml.中没有映射 看起来它在myproject持久化中使用了spring bean sessionFactory。xml(如下)来查找所需的映射文件。我

  • 是否可以在Spring Boot中集成Spring托管Hibernate拦截器(http://docs.jboss.org/Hibernate/orm/4.3/manual/en-us/html/ch14.html)? 我正在使用Spring Data JPA和Spring Data REST并需要一个Hibernate拦截器来处理实体上特定字段的更新。 对于标准的JPA事件,不可能获得旧值,因此