举个例子:我希望在MongoDB中保存一些实体,在Cassandra中保存一些实体。我的存储库接口扩展了CrudRepository。我的Cassandra实体有@Table,我的MongoDb实体有@Document注释。
但是,在启动时,spring-data尝试创建一个MyMongoObjectRepository实例,并因此抱怨"Cassandra实体必须具有@Table、@Persistent或@PrimaryKeyClass注解“。
库如何发现它们应该实现的存储库接口,以及如何控制它们,使它们不试图为不受支持的实体实现它们?
进一步的问题:如果我想在两个存储系统中存储一些实体,可以生成单个存储库的多个实现吗?还是每个存储库都需要一个接口?
编辑在进一步检查时,问题似乎来自实体扫描,而不是存储库扫描。两个映射器都获取所有实体(因为它们的注释都扩展了@Persistent)。其中一个Mongo实体有一个嵌套实体(没有任何注释),Cassandra映射程序无法处理这些实体。
发布于 2016-01-20 13:11:11
问题是,所有不同的实体扫描器都使用@Persistent作为他们正在寻找的注释,而所有特定于回购的注释(@Table、@Document等)还有@Persistent作为元注释。
因此,不同存储库的实体必须在单独的包中,您必须构建自己的扫描器才能将包传递给它,因为它不接受泛型过滤器。
发布于 2016-01-06 09:17:47
您可以在@EnableMongoRepositories和@EnableJpaRepositories中使用basePackages设置来指定它们应该在何处查找存储库定义。
就像这样:
@EnableMongoRepositories(basePackages={
"com.some.package.to.look.inside",
"com.some.package.to.look.also.at"
})和
@EnableJpaRepositories(basePackages={
"com.some.differentpackage.to.look.inside",
"com.some.differentpackage.to.look.also.at"
})为此,您需要在合理的包中命名存储库定义。
回答你的后续问题:
如果您想同时存储多个地方,我将在存储库前面实现一个服务,使用@Autowire来依赖,注入存储库,并在调用存储库方法的服务方法上设置一个@Transactional。在服务方法上使用@Transactional可以确保如果在保存时出现错误,它将确保不留下半途而废的保存,甚至在必要时执行回滚操作。
编辑:
@ transactions不适用于不支持Cassandra和MongoDB等事务的db。
https://stackoverflow.com/questions/34611389
复制相似问题