- 作者简介
- 内容提要
- 关于本书
- 路线图
- 代码规范与下载
- 作者在线
- 封面插图简介
- 前言
- 译者序
- 致谢
- 第1部分 Spring 的核心
- 第1章 Spring 之旅
- 第2章 装配 Bean
- 第3章 高级装配
- 第4章 面向切面的 Spring
- 第2部分 Web 中的 Spring
- 第5章 构建 Spring Web 应用程序
- 第6章 渲染 Web 视图
- 第7章 Spring MVC 的高级技术
- 第8章 使用 Spring Web Flow
- 第9章 保护 Web 应用
- 第3部分 后端中的 Spring
- 第10章 通过 Spring 和 JDBC 征服数据库
- 第11章 使用对象-关系映射持久化数据
- 第12章 使用 NoSQL 数据库
- 第13章 缓存数据
- 第14章 保护方法应用
- 第4部分 Spring 集成
- 第15章 使用远程服务
- 第16章 使用 Spring MVC 创建 REST API
- 第17章 Spring消息
- 第18章 使用 WebSocket 和 STOMP 实现消息功能
- 第19章 使用 Spring 发送 Email
- 第20章 使用 JMX 管理 Spring Bean
- 第21章 借助 Spring Boot 简化 Spring 开发
12.2.2 使用注解标注图实体
Neo4j定义了两种类型的实体:节点(node)和关联关系(relationship)。一般来讲,节点反映了应用中的事物,而关联关系定义了这些事物是如何联系在一起的。
Spring Data Neo4j提供了多个注解,它们可以应用在模型类型及其域上,实现Neo4j中的持久化。表12.3描述了这些注解。
表12.3 借助Spring Data Neo4j的注解,能够将领域类型映射为图中的节点和关联关系
注 解 | 描 述 |
@NodeEntity | 将Java类型声明为节点实体 |
@RelationshipEntity | 将Java类型声明为关联关系实体 |
@StartNode | 将某个属性声明为关联关系实体的开始节点 |
@EndNode | 将某个属性声明为关联关系实体的结束节点 |
@Fetch | 将实体的属性声明为立即加载 |
@GraphId | 将某个属性设置为实体的ID域(这个域的类型必须是Long) |
@GraphProperty | 明确声明某个属性 |
@GraphTraversal | 声明某个属性会自动提供一个iterable元素,这个元素是图遍历所构建的 |
@Indexed | 声明某个属性应该被索引 |
@Labels | 为@NodeEntity声明标签 |
@Query | 声明某个属性会自动提供一个iterable元素,这个元素是执行给定的Cypher查询所构建的 |
@QueryResult | 声明某个Java或接口能够持有查询的结果 |
@RelatedTo | 通过某个属性,声明当前的@NodeEntity与另外一个@NodeEntity之间的关联关系 |
@RelatedToVia | 在@NodeEntity上声明某个属性,指定其引用该节点所属的某一个@RelationshipEntity |
@RelationshipType | 将某个域声明为关联实体类型 |
@ResultColumn | 在带有@QueryResult注解的类型上,将某个属性声明为获取查询结果集中的某个特定列 |
为了了解如何使用其中的某些注解,我们会将其应用到订单/条目样例中。
在该样例中,数据建模的一种方式就是将订单设定为一个节点,它会与一个或多个条目关联。图12.2以图的形式描述了这种模型。
图12.2 连接两个节点的简单关联关系,关系本身不包含任何属性
为了将订单指定为节点,我们需要为Order类添加@NodeEntity注解。如下的程序清单展现了带有@NodeEntity注解的Order类,它还包含了表12.3中的几个其他注解。
程序清单12.10 为Order添加注解,使其成为图数据库中的一个节点
除了类级别上的@NodeEntity,还要注意id属性上使用了@GraphId注解。Neo4j上的所有实体必要要有一个图ID。这大致类似于JPA @Entity以及MongoDB @Document类中使用@Id注解的属性。在这里,@GraphId注解标注的属性必须是Long类型。
customer和type属性上没有任何注解。只要这些属性不是瞬态的,它们都会成为数据库中节点的属性。
items属性上使用了@RelatedTo注解,这表明Order与一个Item的Set存在关联关系。type属性实际上就是为关联关系建立了一个文本标记。它可以设置成任意的值,但通常会给定一个易于人类阅读的文本,用来简单描述这个关联关系的特征。稍后,你将会看到如何将这个标记用在查询中,实现跨关联关系的查询。
就Item本身来说,下面展现了如何为其添加注解实现图的持久化。
程序清单12.11 Item也是图数据库中的节点
类似于Order,Item也使用了@NodeEntity注解,将其标记为一个节点。它同时也有一个Long类型的属性,借助@GraphId注解将其标注为节点的图ID,而product、price以及quantity属性均会作为图数据库中节点的属性。
Order和Item之间的关联关系很简单,关系本身并不包含任何的数据。因此,@RelatedTo注解就足以定义关联关系。但是,并不是所有的关联关系都这么简单。
让我们重新考虑该如何为数据建模,从而学习如何使用更为复杂的关联关系。在当前的数据模型中,我们将条目和产品的信息组合到了Item类中。但是,当我们重新考虑的时候,会发现订单会与一个或多个产品相关联。订单与产品之间的关系构成了订单的一个条目。图12.3描述了另外一种在图中建模数据的方式。
图12.3 关联关系实体自身具有属性
在这个新的模型中,订单中产品的数量是条目中的一个属性,而产品本身是另外一个概念。与前面一样,订单和产品都是节点,而条目是关联关系。因为现在的条目必须要包含一个数量值,关联关系不像前面那么简单。我们需要定义一个类来代表条目,比如如下程序清单所示的LineItem。
程序清单12.12 LineItem类连接了一个Order节点和一个Product节点
Order类通过@NodeEntity注解将其标示为一个节点,而LineItem类则使用了@RelationshipEntity注解。LineItem同样也有一个id属性标注了@GraphId注解,不管是节点实体还是关联关系实体,都必须要有一个图ID,而且其类型必须为Long。
关联关系实体的特殊之处在于它们连接了两个节点。@StartNode和@EndNode注解用在定义关联关系两端的属性上。在本例中,Order是开始节点,Product是结束节点。
最后,LineItem类有一个quantity属性,当关联关系创建的时候,它会持久化到数据库中。
领域对象已经添加了注解,现在就可以保存与读取节点和关联关系了。我们首先看一下如何使用Spring Data Neo4j中的Neo4jTemplate实现面向模板的数据访问。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论