没有可用数据时,不会创建Spring Data MongoDB索引

时间:2015-07-13 19:55:51

标签: mongodb spring-data spock

我正在使用带有Groovy的MongoDB Spring Data Framework,无法解决我的问题: 我想要的:我希望Spring Data用2个索引创建我的MongoDB集合。我有我的POJO课程

@Document(collection='language')
class language {
    @Id
    String Id

    @Indexed(unique = true)
    String isoCode

    String description
}

这是我的存储库:

public interface LanguageRepository extends MongoRepository<Language, String>

  List<Language> findByisoCode(String isoCode);
}

也许还有一些注释,我正在编写代码而没有我的源代码......

我编写了一个spock测试,用于检查是否可以使用相同的isoCode插入两种语言并且需要一个例外。 Spock测试连接应用程序上下文并且工作得很好,除了一点:第一次运行测试时不会创建索引。

我连接我的测试,测试将具有相同isoCode的twi语言插入到MongoDB中,测试失败,因为没有索引可以防止重复的isoCodes。我也可以在MongoShell中看到这一点。测试失败,因为没有索引违规且没有异常。 现在,当我再次运行相同的测试时,我的应用程序甚至无法启动,因为Spring Data似乎在我的MongoDB上创建索引 - 但这也失败了,因为数据库中已经有重复的条目并且索引的创建失败了(当然...)。当我通过MongoShell手动删除其中一个条目并再次运行相同的测试时,一切正常,因为可以创建索引并获得我预期的异常。

有人可以告诉我mongoDB是否以及为什么只有在集合中已有条目时才能创建索引?如果是这样的话:我该如何最好地处理这个问题呢?

亲切的问候 塞巴斯蒂安

编辑Spock测试:

def 'There must not be duplicate languages'() {
        setup:
        Language lang1 = new Language(
                isoCode: 'de-DE',
                description: 'Deutsch (Deutschland)'
        )
        Language lang2 = new Language(
                isoCode: 'de-DE',
                description: 'Deutsch (Schweiz)'
        )
        languageRepository.save(lang1)

        when:
        languageRepository.save(lang2)

        then:
        final org.springframework.dao.DuplicateKeyException ex = thrown()

        cleanup:
        languageRepository.deleteAll()

    }

0 个答案:

没有答案