Java org.hibernate.service.UnknownServiceException:请求未知服务

Java org.hibernate.service.UnknownServiceException:请求未知服务,java,spring,hibernate,spring-test,hibernate-session,Java,Spring,Hibernate,Spring Test,Hibernate Session,我正在为AbstractHibernateRepository保存方法编写一个单元测试。我使用的是spring test runner,但运行时出现以下异常: org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider] at org.hibernate.service.internal.

我正在为AbstractHibernateRepository保存方法编写一个单元测试。我使用的是spring test runner,但运行时出现以下异常:

org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:201)
我的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/spring-hibernate.xml")
public class AbstractHibernateRepoTest extends AbstractHibernateRepo<Video> {
    @Autowired private SessionFactory sessionFactory;
    private Video video;

    public AbstractHibernateRepoTest() 
    {
        super(Video.class);
    }

    @Before
    public void setUp ()
    {
        video = new Video();
        video.setId("xyz");
        video.setName("Video Name");
        video.setSrc("Source");
        video.setThumbnail("Thumbnail");
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.save(video) ;
        session.close();
    }

    @Test
    public void testSaveMethod ()
    {
        video.setId("asa");
        String id = (String) save(video);
        Assert.assertEquals(video.getId(), id);
    }

    @After
    public void breakDown ()
    {
        sessionFactory.close();
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(“文件:src/main/webapp/WEB-INF/spring/spring hibernate.xml”)
公共类AbstractHibernatePotest扩展了AbstractHibernatePo{
@自动连线专用SessionFactory SessionFactory;
私人录像;
公共抽象HibernatePoTest()
{
超级(视频类);
}
@以前
公共无效设置()
{
视频=新视频();
video.setId(“xyz”);
video.setName(“视频名称”);
video.setSrc(“源”);
设置缩略图(“缩略图”);
Session Session=sessionFactory.openSession();
session.beginTransaction();
会话.保存(视频);
session.close();
}
@试验
公共void testSaveMethod()
{
video.setId(“asa”);
字符串id=(字符串)保存(视频);
Assert.assertEquals(video.getId(),id);
}
@之后
公共空间细分()
{
sessionFactory.close();
}
}
存储库:

    @Autowired private SessionFactory sessionFactory;
    private final Class<T> clazz;

    public AbstractHibernateRepo(Class<T> clazz) 
    {
        this.clazz = clazz;
    }

    @SuppressWarnings("unchecked")
    @Transactional(rollbackFor = HibernateException.class)
    @Override
    public T findById(Serializable id) 
    {
        if (id == null)
            throw new NullPointerException();

        return (T) getSessionFactory().getCurrentSession().get(getClazz(), id);
    }

    @Override
    @Transactional(rollbackFor = HibernateException.class)
    public Serializable save(T entity) 
    {
        if (entity == null)
            throw new NullPointerException();

        return getSessionFactory().getCurrentSession().save(entity);
    }

    @Override
    @Transactional(rollbackFor = HibernateException.class)
    public void delete(T entity) 
    {
        if (entity == null)
            throw new NullPointerException();

        getSessionFactory().getCurrentSession().delete(entity);
    }

    @Override
    @Transactional(rollbackFor = HibernateException.class)
    public void update(T entity) 
    {
        if (entity == null)
            throw new NullPointerException();

        getSessionFactory().getCurrentSession().update(entity);
    }
}
@Autowired private SessionFactory SessionFactory;
私人期末班;
公开摘要HibernateEPO(类clazz)
{
this.clazz=clazz;
}
@抑制警告(“未选中”)
@事务性(rollboor=hibernateeexception.class)
@凌驾
公共T findById(可序列化id)
{
if(id==null)
抛出新的NullPointerException();
返回(T)getSessionFactory().getCurrentSession().get(getClazz(),id);
}
@凌驾
@事务性(rollboor=hibernateeexception.class)
公共可序列化存储(T实体)
{
if(实体==null)
抛出新的NullPointerException();
返回getSessionFactory().getCurrentSession().save(实体);
}
@凌驾
@事务性(rollboor=hibernateeexception.class)
公共作废删除(T实体)
{
if(实体==null)
抛出新的NullPointerException();
getSessionFactory().getCurrentSession().delete(实体);
}
@凌驾
@事务性(rollboor=hibernateeexception.class)
公共无效更新(T实体)
{
if(实体==null)
抛出新的NullPointerException();
getSessionFactory().getCurrentSession().update(实体);
}
}
弹簧配置:

<tx:annotation-driven transaction-manager="transactionManager"/> 

<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="org.h2.Driver"/>
    <property name="url" value="jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE"/>
    <property name="username" value="someuser"/>
    <property name="password" value="somepassword"/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="com.package.model"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
    <property name="dataSource" ref="dataSource"/>
</bean>

真的
更新
org.hibernate.dial.h2方言

是什么导致了这个问题?我如何修复它?

我可能完全不在这里,但对我来说,这似乎是一个会话处理异常。在
@Before
中打开并关闭会话,然后在
save()
中获得当前会话,该会话可能是您刚刚关闭的会话,导致异常。如果不在@之前关闭它(我知道这不是解决方案,只是为了验证理论),请尝试一下它是否有效。您还可以尝试在存储库中打开新会话,而不是获取当前会话(也不是解决方案)。与工作测试设置相比,我看到的唯一区别是,在
@Before
中,我们还调用了存储库方法,标记为
@Transactional
,而不是直接创建会话。

我遇到了同样的错误。我在我的案件中发现了原因。我的经验可能会帮助别人

我在我的
sessionFactoryCreated
方法中调用了
ServiceRegistryBuilder.destroy()
,而不是我的
sessionFactoryClosed
方法

基本上,我破坏了我的服务注册表,然后试图获得一个新会话,这使得Hibernate产生了误导性的错误消息


因此,我建议如果有人出现此错误,请检查他们是否正在关闭会话或注册表,然后再次尝试获取它

对于任何未来的谷歌搜索者:


当我看到这个问题时,它是由测试开始之前运行的sql脚本中的错误引起的。将日志往回滚动到足够远的地方就会发现错误,因此值得回顾一下,以检查
UnknownServiceException
不仅仅是另一个问题的副作用。

我遇到了类似的错误,除了未知的服务是[org.hibernate.cache.spi.RegionFactory]这仅在第二次启动spring上下文时发生。该问题是由于org.springframework.transaction.interceptor.TransactionSpectSupport中的beanFactory和事务管理器缓存部分损坏所致。解决方案是调用org.springframework.transaction.interceptor.TransactionSpectSupport#clearTransactionManagerCache

没什么,缓存问题。只需关闭服务器并清理tomcat即可。然后重新启动。我是这样解决的。

我在创建Hibernate单元测试时发现了这个错误。我通过util类创建了会话:
session session=XmlSessionUtil.getSessionFactory().openSession()
session.close()关闭当我删除关闭会话的语句时,所有测试都通过了。所以在我的例子中是异常原因关闭了会话。

我在使用hibernate框架时遇到了这个错误。
session.close();
sessionFactory.close();
所以为了摆脱这个错误,我改变了关闭会话和会话工厂的顺序。像这样

session.close();
sessionFactory.close();
这对我有用。
希望它对你有用。

我在这里补充了拉曼普雷特·辛格的另一个答案。我在tomcat上使用
kill-9
时遇到了这个问题。我可以通过这种方式可靠地重新创建问题。我必须启动我的服务器,优雅地关闭它,然后再次启动它来解决问题

在将jsf版本从2.1.25升级到2.2.0的过程中,我在tomcat服务器启动时也遇到了同样的问题。有什么建议吗