- 前言
- 第一部分 基础应用开发
- 第 1 章 Spring Boot 入门
- 第 2 章 在 Spring Boot 中使用数据库
- 第 3 章 Spring Boot 界面设计
- 第 4 章 提高数据库访问性能
- 第 5 章 Spring Boot 安全设计
- 第二部分 分布式应用开发
- 第 6 章 Spring Boot SSO
- 第 7 章 使用分布式文件系统
- 第 8 章 云应用开发
- 第 9 章 构建高性能的服务平台
- 第三部分 核心技术源代码分析
- 第 10 章 Spring Boot 自动配置实现原理
- 第 11 章 Spring Boot 数据访问实现原理
- 第 12 章 微服务核心技术实现原理
- 附录 A 安装 Neo4j
- 附录 B 安装 MongoDB
- 附录 C 安装 Redis
- 附录 D 安装 RabbitMQ
- 结束语
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
3.1 模型设计
数据管理模块实现了 MVC 中模型的设计,主要负责实体建模和数据库持久化等方面的功能。在本章的实例中,将使用上一章的 Neo4j 数据库的例子,对电影数据进行管理。回顾一下,有两个节点实体(电影和演员)和一个关系实体(角色)。其中,关系实体体现了节点实体之间的关系,即一个演员在一部电影中扮演一个角色。实体建模和持久化与上一章的实现差不多。只不过为了适应本章的内容,电影节点实体和角色关系实体的建模在属性上做了些许调整。另外针对 Neo4j 数据库的分页查询也做了一些调整和优化。
3.1.1 节点实体建模
如代码清单 3-1 所示,在电影节点实体建模中做了一些调整,即增加一个 photo 属性,用来存放电影剧照,并将关系类型更改为“扮演”。需要注意的是,Neo4j 还没有日期格式的数据类型,所以在读取日期类型的数据时,使用注解 @DateTimeFormat 进行格式转换,而在保存时,使用注解 @DateLong 将它转换成 Long 类型的数据进行存储。
代码清单 3-1 电影节点实体建模
@JsonIdentityInfo(generator=JSOGGenerator.class)
@NodeEntity
public class Movie {
@GraphId
Long id;
private String name;
private String photo;
@DateLong
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createDate;
@Relationship(type="扮演
", direction = Relationship.INCOMING)
List<Role> roles = new ArrayList<>();
public Role addRole(Actor actor, String name){
Role role = new Role(actor,this,name);
this.roles.add(role);
return role;
}
public Movie() { }
......
}
3.1.2 关系实体建模
电影实体对应的角色关系实体建模的关系类型也同样做了调整而改为“扮演”,如代码清单 3-2 所示。
代码清单 3-2 角色关系实体建模
@JsonIdentityInfo(generator=JSOGGenerator.class)
@RelationshipEntity(type = "扮演
")
public class Role {
@GraphId
Long id;
String name;
@StartNode
Actor actor;
@EndNode
Movie movie;
public Role() {
}……
}
3.1.3 分页查询设计
对于新型的 Neo4j 数据库来说,由于它的资源库遵循了 JPA 的规范标准来设计,在分页查询方面有的地方还不是很完善,所以在分页查询中,设计了一个服务类来处理,如代码清单 3-3 所示。其中,使用 Class<T>传入调用的实体对象,使用 Pageable 传入页数设定和排序字段设定的参数,使用 Filters 传入查询的一些节点属性设定的参数。
代码清单 3-3 Neo4j 分页查询服务类
@Service
public class PagesService<T> {
@Autowired
private Session session;
public Page<T> findAll(Class<T> clazz, Pageable pageable, Filters filters){
Collection data = this.session.loadAll(clazz, filters, convert
(pageable.getSort()), new Pagination(pageable.getPageNumber(), pageable.getPageSize()), 1);
return updatePage(pageable, new ArrayList(data));
}
......
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论