【发布时间】:2013-07-25 09:45:17
【问题描述】:
这里我对 spring 单例对象有一个疑问。
Spring 将根据作用域为每个 bean 定义创建至少一个对象。 对于单例范围,每个 bean 定义只会获得一个对象。
由于 spring 上下文为我们提供了单例实例,那么为什么我不能共享它的同一个会话。
以下代码报错:
抛出空指针错误。 org.hibernate.TransactionException:事务未成功启动
尝试访问同一个实例会话时。甚至会话实例为空。
在主方法中
public static void main(String[] args)
{
TestDao dao = (TestDao) ApplicationContext.getInstance().getBean(DaoType.TestDao.toString());
dao.startOperation();
for(Test test:testList)
{
saveIsBean(test,true)
}
dao.endOperation();
}
如果会话打开,此方法会保存数据然后重用它。
private void saveIsBean(IsBean isBean,boolean isSessionAlreadyOpen) throws NTException
{
TestDao dao = (TestDao) ApplicationContext.getInstance().getBean(DaoType.TestDao.toString());
if(isSessionAlreadyOpen)
{
//dao.startOperation(); If I start session again then it works.
dao.getSession().saveOrUpdate(isBean); //Throw null pointer error. org.hibernate.TransactionException: Transaction not successfully started
}
else
{
dao.saveOrUpdate(isBean);
}
}
public void startOperation() throws HibernateException {
session = HibernateFactory.openSession();
transaction = session.beginTransaction();
}
如果我再次启动会话或在方法中传递相同的会话实例,那么它工作正常,但我不明白为什么它不起作用。 单例实例在 spring 上下文中没有相同的状态!!
提前致谢
【问题讨论】:
-
Spring 应用程序上下文永远不会被引导。