首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用多个spring-boot-starter data-*依赖项

如何使用多个spring-boot-starter data-*依赖项
EN

Stack Overflow用户
提问于 2016-01-05 12:10:30
回答 2查看 759关注 0票数 1

举个例子:我希望在MongoDB中保存一些实体,在Cassandra中保存一些实体。我的存储库接口扩展了CrudRepository。我的Cassandra实体有@Table,我的MongoDb实体有@Document注释。

但是,在启动时,spring-data尝试创建一个MyMongoObjectRepository实例,并因此抱怨"Cassandra实体必须具有@Table、@Persistent或@PrimaryKeyClass注解“。

库如何发现它们应该实现的存储库接口,以及如何控制它们,使它们不试图为不受支持的实体实现它们?

进一步的问题:如果我想在两个存储系统中存储一些实体,可以生成单个存储库的多个实现吗?还是每个存储库都需要一个接口?

编辑在进一步检查时,问题似乎来自实体扫描,而不是存储库扫描。两个映射器都获取所有实体(因为它们的注释都扩展了@Persistent)。其中一个Mongo实体有一个嵌套实体(没有任何注释),Cassandra映射程序无法处理这些实体。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-20 13:11:11

问题是,所有不同的实体扫描器都使用@Persistent作为他们正在寻找的注释,而所有特定于回购的注释(@Table@Document等)还有@Persistent作为元注释。

因此,不同存储库的实体必须在单独的包中,您必须构建自己的扫描器才能将包传递给它,因为它不接受泛型过滤器。

票数 0
EN

Stack Overflow用户

发布于 2016-01-06 09:17:47

您可以在@EnableMongoRepositories和@EnableJpaRepositories中使用basePackages设置来指定它们应该在何处查找存储库定义。

就像这样:

代码语言:javascript
复制
@EnableMongoRepositories(basePackages={
        "com.some.package.to.look.inside",
        "com.some.package.to.look.also.at"
})

代码语言:javascript
复制
@EnableJpaRepositories(basePackages={
        "com.some.differentpackage.to.look.inside",
        "com.some.differentpackage.to.look.also.at"
})

为此,您需要在合理的包中命名存储库定义。

回答你的后续问题:

如果您想同时存储多个地方,我将在存储库前面实现一个服务,使用@Autowire来依赖,注入存储库,并在调用存储库方法的服务方法上设置一个@Transactional。在服务方法上使用@Transactional可以确保如果在保存时出现错误,它将确保不留下半途而废的保存,甚至在必要时执行回滚操作。

编辑:

@ transactions不适用于不支持Cassandra和MongoDB等事务的db。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34611389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档