Spring boot 如何使用多个spring启动程序数据-*依赖项
举个例子:我希望在MongoDB中持久化一些实体,在Cassandra中持久化一些实体。 我的存储库接口扩展了Spring boot 如何使用多个spring启动程序数据-*依赖项,spring-boot,spring-data,Spring Boot,Spring Data,举个例子:我希望在MongoDB中持久化一些实体,在Cassandra中持久化一些实体。 我的存储库接口扩展了crudepository。我的Cassandra实体有@表,我的MongoDb实体有@文档注释 但是,在启动时,spring data尝试创建MyMongoObject存储库的实例,因此抱怨“Cassandra实体必须具有@Table、@Persistent或@PrimaryKeyClass注释” 库如何发现它们应该实现哪些存储库接口,我如何控制它们,使它们不会尝试为不受支持的实体实现
crudepository
。我的Cassandra实体有@表
,我的MongoDb实体有@文档
注释
但是,在启动时,spring data尝试创建MyMongoObject存储库的实例,因此抱怨“Cassandra实体必须具有@Table、@Persistent或@PrimaryKeyClass注释”
库如何发现它们应该实现哪些存储库接口,我如何控制它们,使它们不会尝试为不受支持的实体实现它们
进一步的问题:如果我想在两个存储系统中存储一些实体,是否可以生成单个存储库的多个实现,或者是否需要为每个存储库提供一个接口
编辑
进一步检查,问题似乎来自实体扫描,而不是存储库扫描。两个映射器都拾取所有实体(因为它们的注释都扩展了@Persistent
)。其中一个Mongo实体具有Cassandra mapper无法处理的嵌套实体(没有任何注释)。您可以使用@EnableMongorPositories和@EnableJpaRepositories中的basePackages
设置来指定它们应该在何处查找存储库定义
像这样:
@EnableMongoRepositories(basePackages={
"com.some.package.to.look.inside",
"com.some.package.to.look.also.at"
})
及
为此,您需要在合理的包中为存储库定义命名名称空间
回答您的后续问题:
如果您希望同时将实体存储在多个位置,我将在存储库前面实现一个服务,使用@Autowire注入存储库的依赖关系,并在调用存储库方法的服务方法上设置@Transactional。在服务方法上使用@Transactional可以确保如果在保存时发生错误,那么就不会有中途保存,甚至在必要时执行回滚
编辑:
@事务性不适用于不支持Cassandra和MongoDB等事务的db。问题是,所有不同的实体扫描程序都使用@Persistent
作为它们要查找的注释,而所有特定于回购协议的注释(@Table
,@Document
等)还有@Persistent
作为元注释
因此,不同存储库的实体必须位于单独的包中,并且您必须构建自己的扫描仪,以便将包传递给它,因为它不接受通用过滤器。据我所知,您可以将mongo/cassandra存储库放在单独的包中,并使用@enablemongoreposities
和@enableJPoreposities
在适当的包中查找存储库。MongoDB和cassandra都不支持事务,但这是一个很好的系统提示。谢谢你提供的信息。我在我的答案中添加了一个编辑。我的回答解决了你的问题吗。还是还有问题没有回答?存储库不需要放在单独的包中,因为@EnableXRepositories注释也接受过滤器。解决方案是将实体放在单独的包中,因为实体扫描程序不支持过滤器。
@EnableJpaRepositories(basePackages={
"com.some.differentpackage.to.look.inside",
"com.some.differentpackage.to.look.also.at"
})