其他分享
首页 > 其他分享> > Halo 开源项目学习(二):实体类与数据表

Halo 开源项目学习(二):实体类与数据表

作者:互联网

基本介绍

Halo 项目中定义了一些实体类,用于存储博客中的关键数据,如用户信息、文章信息等。在深入学习 Halo 的设计理念与实现过程之前,不妨先学习一下一个完整的博客系统都由哪些元素组成。

实体类

Halo 中的除 BaseEntity 外的每一个实体类都对应着一个数据表,以 User 类为例,每一个 User 对象都对应 users 表中的一条记录,每一个对象属性的值也等于数据表中对应字段的值。

User 类定义如下:

@Data // Lombok 注解, 自动生成 get()、set()、toString() 等方法
@Entity // JPA 注解, 声明该类为一个实体类, 必须与 @Id 搭配使用
@Table(name = "users") // JAP 注解, 声明该类映射到数据库的 users 数据表
@ToString(callSuper = true) // Lombok 注解, callSuper = true 表示调用 toString() 方法时输出父类的属性
@EqualsAndHashCode(callSuper = true) // 自动生成 equals() 和 hashCode() 方法, 默认 callSuper 为 false, 为 true 表示 equals() 方法比较时会调用父类的 equals() 方法
public class User extends BaseEntity {

    @Id // JPA 注解, 声明主键
    @GeneratedValue(strategy = GenerationType.IDENTITY) // JPA 注解, 声明主键的生成策略, IDENTITY 表示使用自增 id
    @Column(name = "id") // JPA 注解, 声明实体类的属性 id 映射到数据表中的字段 id
    private Integer id;

    /**
     * User name.
     */
    @Column(name = "username", columnDefinition = "varchar(50) not null")
    private String username;

    /**
     * User nick name,used to display on page.
     */
    @Column(name = "nickname", columnDefinition = "varchar(255) not null")
    private String nickname;

    /**
     * Password.
     */
    @Column(name = "password", columnDefinition = "varchar(255) not null")
    private String password;

    /**
     * User email.
     */
    @Column(name = "email", columnDefinition = "varchar(127) default ''")
    private String email;

    /**
     * User avatar.
     */
    @Column(name = "avatar", columnDefinition = "varchar(1023) default ''")
    private String avatar;

    /**
     * User description.
     */
    @Column(name = "description", columnDefinition = "varchar(1023) default ''")
    private String description;

    /**
     * Expire time.
     */
    @Column(name = "expire_time", columnDefinition = "timestamp default CURRENT_TIMESTAMP")
    @Temporal(TemporalType.TIMESTAMP)
    private Date expireTime;


    @Override
    public void prePersist() {
        super.prePersist();

        id = null;

        if (email == null) {
            email = "";
        }

        if (avatar == null) {
            avatar = "";
        }

        if (description == null) {
            description = "";
        }

        if (expireTime == null) {
            expireTime = DateUtils.now();
        }
    }
}

注解解释:

User 类中定义了用户名、昵称、邮箱等用户数据,Halo 使用 JPA 将实体对象持久化到数据库中,也就是将 User 对象的各个属性存储到数据表 users 的各个字段中。JPA 支持自动创建数据表,所以启动项目前无需建表,关于 JPA 的使用,可以参考 SpringBoot 整合 Spring Data JPA

User 类继承了 BaseEntity,BaseEntity 类中定义了一些通用的属性,如 createTime、updateTime 以及 deleted 等,分别指用户的创建时间、修改时间以及是否被删除,users 表中有对应的字段。此外,BaseEntity 类还定义了三个方法,分别为 prePersist()、preUpdate() 和 preRemove():

BaseEntity 并没有对应某一个数据表,它被 @MappedSuperclass 修饰, @MappedSuperclass 属于 JPA 注解,应用于实体类的父类中, 该注解作用的类不会映射到数据表,但其属性都将映射到子类所对应的数据表。也就是说不同实体类的通用属性可在相同的父类中定义,子类继承父类后,父类中的这些通用属性会持久化到子类对应的数据表中。

BaseEntity 类定义如下:

@Data
@ToString
@MappedSuperclass // JPA 注解, 应用于实体类的父类中, 该注解作用的类不会映射到数据表,但其属性都将映射到子类的数据表
@EqualsAndHashCode
public class BaseEntity {

    /**
     * Create time.
     */
    @Column(name = "create_time", columnDefinition = "timestamp default CURRENT_TIMESTAMP")
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTime;

    /**
     * Update time.
     */
    @Column(name = "update_time", columnDefinition = "timestamp default CURRENT_TIMESTAMP")
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateTime;

    /**
     * Delete flag.
     */
    @Column(name = "deleted", columnDefinition = "TINYINT default 0")
    private Boolean deleted = false;

    @PrePersist // @PrePersist 事件在实体对象插入到数据库的过程中发生
    protected void prePersist() {
        deleted = false;
        Date now = DateUtils.now();
        if (createTime == null) {
            createTime = now;
        }

        if (updateTime == null) {
            updateTime = now;
        }
    }

    @PreUpdate // @PreUpdate 事件在实体的状态同步到数据库之前触发
    protected void preUpdate() {
        updateTime = new Date();
    }

    @PreRemove // @PreRemove 事件在实体从数据库删除之前触发
    protected void preRemove() {
        updateTime = new Date();
    }
}

数据表

项目启动成功后,JPA 会为实体类自动生成对应的数据表。可以使用 Navicat 查看 MySQL 中库名为 'halodb' 的数据库(自己配置的库名),发现自动创建了如下数据表:

数据表

下面介绍不同数据表的作用以及对应的字段含义,由于许多实体类都继承自 BaseEntity,所以不同数据表中会有一些通用的字段,如:

下面介绍各个数据表中,特定字段的具体含义:

1. attachments:附件表,用于存放图片和文件。

2. categories:文章分类目录表,发布文章时可设置文章所属的分类。

3. comment_black_list:评论黑名单表,用于禁止某个 ip 进行评论。

4. comments:评论表,可对文章进行评论,也可对评论进行回复,还可以对页面(友情链接、图库、日志等)进行评论。

5. journals:用户日志表,在 Halo 中用户可以对外分享日志(记录生活的日志),日志的信息存储在 journals 表中。

6. links:友情链接表,用于访问其他博客或资源。

7. logs:系统日志表,记录用户的操作。

8. menus:菜单表,博客的主页有多个菜单,且每个菜单都可以是多级菜单。

9. metas:元数据表,用于设置文章或页面的属性,可在发布文章或页面时的 "高级" 选项中进行操作。

10. options:博客设置表,或者称为选项表,用于存储系统设置的相关信息。用户可在 Dashboard 界面的 "系统" -> "博客设置" 中进行配置。

11. photos:图片表,Halo 可以设置图库,图库页面的图片存放在 photos 表中。

12. post_categories:文章 - 分类的关系表,记录每个文章属于哪个分类。

13. post_tags:文章标签表,记录文章的标签。

14. posts:文章表,也用来存储页面。

15. tags:标签表,发布文章时,可为文章设置标签。

16. theme_settings:主题设置表,设置博客主题。

17. users:用户表,记录用户信息。

标签:实体类,name,数据表,key,注解,type,id,Halo
来源: https://www.cnblogs.com/johnlearning/p/16182995.html