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

如何在具有多个模块的应用程序中使用单一会话工厂

常翰
2023-03-14

我有一个会话工厂bean定义如下:

   <bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
    </bean>
    <bean id="dataSource" 
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.h2.Driver" />
        <property name="url" value="jdbc:h2:tcp://localhost/~/test" />
    </bean>

我知道配置数据在另一个文件中有点奇怪,而我可以直接将其写入bean定义中。但它确实有效。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
     <session-factory>
      <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
      <property name="hibernate.connection.username">sa</property>
      <property name="hibernate.connection.password"></property>
      <property name="hibernate.hbm2ddl.auto">update</property>
     </session-factory>
    </hibernate-configuration>

因此,我正在尝试与会话工厂进行一些工作。它正在工作。我连接到一个数据库,我可以使用会话工厂来保存、更新或从数据库中获取内容。实施效果良好。

现在我试图在另一个模块中使用相同的会话工厂。我用spring把这个mySessionFactory bean注入其中。而且没用。

然后我将mySessionFactory bean的范围更改为“原型”,并且在两个模块中一切都运行良好。

现在我猜想问题是,当SessionFactory是单例时,它在不同的模块中是看不到的。下面是一个使用SessionFactory的方法示例

public T fetchById(Class<T> p_type, Long p_id) {

        Session session;
        Transaction transaction;

        T returnT;

        session = sessionFactory.openSession();

        transaction = session.beginTransaction();

        returnT = (T) session.get(p_type, p_id);

        transaction.commit();
        session.close();

        return returnT;

    } 

我有几个这样的例子,同样,如果mySessionFactory是一个原型,它们都可以在整个应用程序中工作,所以我不认为这是一个依赖问题。但是,如果mySessionFactory是默认的单例,那么这些方法只在定义bean的模块中有效。

我得到的例外是:

org . hibernate . service . unknownserviceexception:请求的未知服务[org . hibernate . engine . JDBC . connections . SPI . connection provider]

我的问题是,如何在整个应用程序中使用SessionFactory的单个实例。我不想每次调用方法时都创建一个新的SessionFactory。

我对java中的线程没有透彻的了解,所以我不确定有什么问题。我只能猜测。如果这个问题缺乏信息,我很抱歉。

谢谢你的帮助。

共有1个答案

嵇俊德
2023-03-14

两个选项;

1.Hibernate单例会话生成器:

使用单例设计模式,并使用返回单例会话的静态方法创建类

import org.hibernate.cfg.Configuration;
import org.hibernate.Session;        
import org.hibernate.SessionFactory;

public class HibernateSession {

  static Configuration config;
  static SessionFactory sf;
  static Session session;

  public static Session getSession() {

    if(session==null){

      config=new Configuration();
      sf=config.configure().buildSessionFactory();
      session = sf.openSession();
    }

    return session;
  }
}

2.

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringHibernateSession extends HibernateDaoSupport {   

  static SessionFactory sf;
  static Session session;

  public static Session getSession() {

    if(session==null){

         ApplicationContext appContext = new ClassPathXmlApplicationContext("path to the xml file with ur bean id mySessionFactory ");

         sf=(SessionFactory) appContext.getBean("mySessionFactory");
         session=sf.openSession();

    }
    return session;
  }
}
 类似资料:
  • 问题内容: 我有一个Appp类,它从Application扩展并在清单中调用Appp。 还有两个jar,每个作者都说在清单中将它们称为Application标记。 根据android问题中如何处理多个应用程序类,要具有从Application扩展的多个应用程序类,我们应该从另一个应用程序类扩展某个应用程序类,并在清单中调用上层类。 但就我而言,我没有资源,只有罐子。我能做什么?! 问题答案: 解决

  • 我在多模块项目中工作。目前我面临以下问题: > 模块A 模块B 模块A依赖于B 模块A有以下方法@GetMapping(path=“/GetWorkspace”) } 模块B有以下方法,我需要使用模块A提到的endpoint 公共字符串consumeModuelAMethod(){ 当我从模块A通过RestTemboard调用“http://localhost:8080/getworkspaces

  • 在我的Android应用程序项目中,我试图避免在我的项目中引用一个外部Maven库,否则我会从那里加载多个。组成一个SDK的aar工件。 相反,我想将 .aar 文件放入我的项目中,然后从我的一个 Gradle Android 库模块中引用它们。 我已经尝试了不同的方法——但都不管用。 灵感来自 https://stackoverflow.com/a/72672032/35689 在这里,我的工件

  • 问题内容: 我需要使用FS模块(fs.writeFile)在文件中写入一些数据。我的堆栈是webpack +反应+还原+电子。 第一个问题是: 无法解析模块’fs’ 。我尝试使用 经过几次尝试,问题得以解决( 节点:{fs:“ empty”} )。但是,还有第二个问题:屏幕截图。 您可以看到 fs 是空对象,并且方法writeFile no不存在。我试图更改webpack的配置。 在这种情况下,

  • 问题内容: 我有几个模块-假设是server.js,module1.js,…,moduleN.js。 我想在server.js中定义日志文件: 然后在我所有的模块中使用它 最好的方法是什么?我可以在每个模块中,然后在server.js中进行设置,但是还有更好的解决方案吗? 先感谢您! 问题答案: 默认的记录器概念很好地解决了这一问题。 Winston定义了一个默认记录器,任何对Winston的直接

  • 我有一个Android应用程序,我可以在其中向一个servlet发送多部分post。但我要把电话限制在每5分钟一次。有了web表单,我就可以使用cookie了。对于android应用程序,它不是这样工作的。我怎么才能让它工作呢?