在Spring中自动连接两个Neo4j GraphRepository

时间:2014-08-29 03:03:57

标签: spring spring-mvc neo4j autowired

我刚接触使用Spring和Neo4j,我对GraphApository的@Autowire有疑问。

我见过的大多数示例都是每个Controller使用一个@Autowire,但我有两个节点需要在控制器中调用特定方法时同时修改。我应该简单地@Autowire两个节点的存储库(例如,根据下面的代码)?如果我在具有相同存储库的第二个控制器中执行此操作会有什么影响(所以如果我有一个ChatSessionController,它也是@Autowired ChatMessageService和ChatSessionService)?

ChatMessageController.java

@Controller
public class ChatMessageController {

@Autowired
private ChatMessageService chatMessageService;
@Autowired
private ChatSessionService chatSessionService;

@RequestMapping(value = "/message/add/{chatSessionId}", method = RequestMethod.POST)
@ResponseBody
@Transactional
public void addMessage(@RequestBody ChatMessagePack chatMessagePack,
        @PathVariable("chatSessionId") Long chatSessionId) {
    ChatMessage chatMessage = new ChatMessage(chatMessagePack);
    chatMessageService.save(chatMessage);
    // TODO: Make some modifications to the ChatSession as well
}

}

任何帮助将不胜感激!我一直在谷歌搜索并通过Stackoverflow来更好地理解这一点,但我还没有找到任何东西。任何指向正确的指针都会很棒。

另一个潜在的问题是,我应该(并且可以吗?)修改处理特定节点的GraphRepository中的其他节点吗?例如,我的GraphRepository能否修改我的GraphRespository?

谢谢!

1 个答案:

答案 0 :(得分:1)

我不相信这是一个SO问题,它也不是真正的Neo4J或Spring问题,更多的是关于应用程序的架构。然而,假设您了解类扇出的负面影响,以及如何使用@Transactional注释来实现您想要的内容,那么您的问题的答案就是拥有多个存储库(Neo4J或其他,自动装配或其他方式)在你的班级和你想要的课程中。

Neo4J交易default to Isolation level READ_COMMITTED如果您还需要其他任何东西,您需要自己添加防护/锁。嵌套事务被视为同一事务。 Spring @Transactional注释依赖于您应该注意的代理,因为它们在同一个类中调用方法时会产生影响。

我会在Spring Data上查看this tuotorial并了解真实世界与域名与节点模型的不同之处,会有一个存储库影响另一个节点类型的情况,但我认为它通常是透明的给你(即添加关系)。您可以在每个存储库中执行您喜欢的操作(它们的一般特性主要局限于所有内置的CRUD和使用@Query注释从查找器方法名称(请参阅documentation)派生的查询,以及一些查询有副作用,但在很大程度上你应该避免它。

当你开始向多个控制器添加多个存储库时,我认为你的代码会开始闻起来很糟糕,你应该考虑将这个业务逻辑封装在自己的某个地方,整齐地进行单元测试。我也不会将自己绑定到每个数据对象的一个​​控制器,只需一个带有POST / chat /的ChatController创建一个新会话和POST / chat / {sessionId}来添加消息就可以了。关于程序员的问题: