【问题标题】:org.hibernate.service.UnknownServiceException: Unknown service requestedorg.hibernate.service.UnknownServiceException:请求未知服务
【发布时间】:2014-12-15 15:34:09
【问题描述】:

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

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();
    }
}

存储库:

    @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);
    }
}

弹簧配置:

<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>

是什么导致了这个问题,我该如何解决?

【问题讨论】:

    标签: java spring hibernate spring-test hibernate-session


    【解决方案1】:

    我在这里添加了来自 Ramanpreet Singh 的另一个答案。我在 tomcat 上使用 kill -9 时遇到了这个问题。我可以通过这种方式可靠地重新创建问题。我必须启动我的服务器,优雅地关闭它,然后再次启动它以解决问题。

    【讨论】:

      【解决方案2】:

      我在使用休眠框架时遇到了这个错误。 所以摆脱这个错误我改变了关闭会话和会话工厂的顺序。像这样。

      session.close();
      sessionFactory.close();
      

      它对我有用。 希望它对你有用。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 但我们必须关闭会话。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 受保护的怎么称呼?
          • @GeorgeVinokhodov 可能他扩展了那个类并称之为它
          【解决方案6】:

          对于任何未来的 Google 搜索者:

          当我看到这个问题时,它是由测试开始之前正在运行的 sql 脚本中的错误引起的。在日志中向后滚动足够远会发现错误,因此值得回顾一下 UnknownServiceException 是否只是另一个问题的副作用。

          【讨论】:

            【解决方案7】:

            我遇到了同样的错误。我发现了我的情况的原因。我的经验可能对其他人有所帮助。

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

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

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

              猜你喜欢
              • 2015-12-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-05-03
              • 2011-03-08
              • 2011-02-08
              • 2019-04-04
              相关资源
              最近更新 更多