在同一应用程序上下文中启用两个Spring Data存储库(neo4j和h2)

时间:2016-10-25 21:08:54

标签: java spring neo4j spring-data-jpa spring-data-neo4j

我似乎无法让SDN(最新快照)与Spring Data JPA(H2)一起玩得很好。我不需要跨两个数据存储的跨域支持;相反,我的愿望就是在同一个类中为两个商店简单地使用存储库。例如

public MySpringControlledClass{

   @Autowired
   private MyNeo4jBasedRepository myNeo4jBasedRepository;

   @Autowired
   private MyH2BasedRepository myH2BasedRepoistory;
   ...
}

当我启用neo4j和JPA时,我得到了表单

的例外
  

引起:   org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名为'myNeo4jBasedRepository'的bean时出错:不满意   通过方法'setMappingContext'参数0表示的依赖;   嵌套异常是   org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有   合格的bean类型   定义了[org.springframework.data.mapping.context.MappingContext]:   预期单匹配bean但发现2:   neo4jMappingContext,jpaMappingContext

这是预期的,因为我现在有两个映射上下文,一个由SDN隐式创建,一个在我的配置中为spring数据JPA显式创建。

虽然我在spring数据jpa中找到了描述如何使用两个不同数据库执行此操作的帖子,但我还没有找到如何使用SDN和Spring数据JPA存储(如H2)的示例。差异似乎是SDN隐藏了开发人员的一些boilderplate逻辑。

任何帮助都会非常感激,因为我花了很多时间尝试各种各样的事情,到目前为止还没有任何成果。

非常感谢!

2 个答案:

答案 0 :(得分:3)

所以在你的myNeo4jBasedRepository中有一个setMappingContext方法是自动连线的,它不知道是使用neo4jMappingContext还是jpaMappingContext因为这两个bean都是与依赖项具有相同的类型。

我不确定你接触到了多少,但是如果可能的话,你的MyNeo4jBasedRepository覆盖你的setMappingContext方法来取一个neo4jMappingContext bean类型的类型来让它选择这个

或覆盖setMappingContext方法只需super.setMappingContext,并将限定符@Qualifier("neo4jMappingContext")放在顶部:

@Autowired
@Qualifier("neo4jMappingContext")
public void setMappingContext(TODO todo)
{
  //super.setMappingContext(todo) Sample implementation as before
}

这将确保Spring选择正确的依赖关系。

答案 1 :(得分:2)

已将错误修复推送到Spring Data Neo4j 4.2.0.BUILD-SNAPSHOT,这意味着您不再需要使用@Qualifier或在配置中定义MappingContext bean。您只需要定义相应的PlatformTransactionManager,然后通过@EnableXXXRepositories属性将其与transactionManagerRef相关联。

我在这里创建了一个项目来演示如何让两个Spring Data项目与Spring Boot一起工作:https://github.com/mangrish/spring-data-jpa-neo4j-with-boot