返回介绍

3.1 模型设计

发布于 2025-04-26 13:26:32 字数 2179 浏览 0 评论 0 收藏

数据管理模块实现了 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));
    }
......

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。