我有一个像这样定义的会话工厂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>
所以我正在尝试与会话工厂做一些工作。它正在发挥作用。我已连接到数据库,我可以使用会话工厂来保存或更新或从数据库中获取内容。实施工作。
现在我正在尝试在另一个模块中使用相同的Session工厂。我使用spring将mySessionFactory bean注入其中。它不起作用。
然后我将mySessionFactory bean的范围更改为“prototype”,两个模块中的一切都运行良好。
现在我猜测问题是,当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.ConnectionProvider]
我的问题是在整个应用程序中使用SessionFactory的单个实例需要采取什么方法。我不希望每次调用方法时都创建一个新的SessionFactory。
我对java中的线程没有透彻的理解,所以我不确定是什么问题。我只能猜一猜。如果这个问题缺乏信息,我很抱歉。
感谢您的帮助。
答案 0 :(得分:3)
两个选项;
1.hibernate singleton session generator:
使用单例设计模式并使用返回单例会话的静态方法创建一个类
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;
}
}