【问题标题】:*.hbm.xml mapping files not loaded in test*.hbm.xml 映射文件未在测试中加载
【发布时间】:2016-02-03 10:30:21
【问题描述】:

请看项目:https://github.com/darzz/boot_bug 这是重现错误的最小设置。

说明: 应用程序堆栈是带有 Spring Data 和 Spring Batch 的 Spring Boot。 src/main/resources/queries下有testNamedQuery.hbm.xml文件。

Application 类运行时,批处理作业成功完成,日志中没有异常。但是,当从 ApplicationNotWorking 类运行时,它是完全复制的,只需放入测试源根目录,批处理作业就会失败:

Caused by: org.hibernate.MappingException: Named query not known: findPersonNames
    at org.hibernate.internal.AbstractSessionImpl.getNamedQuery(AbstractSessionImpl.java:177) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.springframework.batch.item.database.HibernateItemReaderHelper.createQuery(HibernateItemReaderHelper.java:146) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.batch.item.database.HibernateItemReaderHelper.getForwardOnlyCursor(HibernateItemReaderHelper.java:123) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.batch.item.database.HibernateCursorItemReader.doOpen(HibernateCursorItemReader.java:185) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:144) ~[spring-batch-infrastructure-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    ... 39 common frames omitted

看起来在运行测试时,没有加载 *.hbm.xml 文件! 经过研究和调试,我想,我可能找到了原因 - 为目标/测试类的测试设置了持久性单元根 url,但映射文件在 /target/classes 中。

可能的原因在我看来可能与这里http://blog.carbonfive.com/2007/05/17/using-classpath-vs-classpath-when-loading-spring-resources/中描述的类似

但是我不知道如何在 Spring Boot 中解决这个问题,而不是仅仅为了测试目的而创建 persistence.xml 配置。也不想将 *.hbm.xml 文件从 main/resources 复制到 test/resources。

有人有想法吗?

【问题讨论】:

    标签: java spring hibernate spring-boot hibernate-mapping


    【解决方案1】:

    如果你想在测试期间加载所有资源/bean,你应该以不同于你的方式编写测试

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @TransactionConfiguration(defaultRollback = true)
    @Transactional
    public class DummyTest{
    
        @Test
        public void test(){
           //
      }
    }
    

    应该使用 hbm 映射加载所有资源

    【讨论】:

    • 嗨,不幸的是,这不是解决方案。我知道这是编写测试的正确方法,但无论哪种情况都存在问题。
    【解决方案2】:

    尝试在您的存储库或配置类中添加@EnableJpaRepositories(basePackages="com.example.your.package")

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多