Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何使用多个spring启动程序数据-*依赖项_Spring Boot_Spring Data - Fatal编程技术网

Spring boot 如何使用多个spring启动程序数据-*依赖项

Spring boot 如何使用多个spring启动程序数据-*依赖项,spring-boot,spring-data,Spring Boot,Spring Data,举个例子:我希望在MongoDB中持久化一些实体,在Cassandra中持久化一些实体。 我的存储库接口扩展了crudepository。我的Cassandra实体有@表,我的MongoDb实体有@文档注释 但是,在启动时,spring data尝试创建MyMongoObject存储库的实例,因此抱怨“Cassandra实体必须具有@Table、@Persistent或@PrimaryKeyClass注释” 库如何发现它们应该实现哪些存储库接口,我如何控制它们,使它们不会尝试为不受支持的实体实现

举个例子:我希望在MongoDB中持久化一些实体,在Cassandra中持久化一些实体。 我的存储库接口扩展了
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"
})