一、实体设计



1.实体类:


  • 博客 Blog
  • 博客分类 Type
  • 博客标签 Tag
  • 博客评论 Comment
  • 用户 User

2.实体之间的关系:

  • 博客-分类:一篇博客只能属于一个分类,一个分类中可以有多篇博客
  • 博客-标签:一篇博客可以有多个标签,一个标签内也可有多篇博客
  • 博客-用户:一篇博客只能属于一个用户,一个用户可以有多篇博客
  • 博客-评论:一篇博客可以有多个评论,一个评论只能在一篇博客

基于springboot个人博客系统参考文献_List


3.评论类自关联关系:

  • 评论 :parentComment
  • 评论回复:replyComment
  • 每个parentComment(评论) 可以有多个replayComment(评论回复)

基于springboot个人博客系统参考文献_实体类_02


二、实体类构建(使用JPA进行构建)


1.博客实体


分析:
1.数据库中设计的属性:主键(id)、博客标题(title)、博客内容(content)、首图地址(firstPicture)、
标记是否原创(flag)、浏览次数(views)、评论次数(commentCount)、
是否开启赞赏(appreciation)、是否开启版权(shareStatement)、是否开启评论(commentabled)、
是否发布(published)、是否推荐(recommend)、创建时间(createTime)、更新时间(updateTime)、博客描述(description)
2.还需要 分类(type)、用户(user)、评论集合(comments)以及分类对象(Type),标签(tags)用来实现JPA的多表查询和相关功能

基于springboot个人博客系统参考文献_实体类_03


相关代码(省略get、set和toString方法):

/**
 * 博客实体类
 */

@Entity
@Table(name = "t_blog")
public class Blog {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;  //主键
    private String title;  //博客标题

    @Basic(fetch = FetchType.LAZY)
    @Lob
    private String content;  //博客内容   设置为长类型
    private String firstPicture;  //首图地址
    private String flag;     //标记是否原创
    private Integer views;   //游览次数
    private boolean appreciation;   //是否开启赞赏功能
    private boolean shareStatement;  //是否开启版权
    private boolean commentabled;   //是否开启评论
    private boolean published;     //是否发布
    private boolean recommend;     //是否推荐
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTime;     //创建时间
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateTime;     //修改更新的时间

    private String description;  //博客描述

    @ManyToOne      //Many关系维护端
    private Type type;   //一个分类对应多个博客

    @ManyToMany(cascade = {CascadeType.PERSIST})
    private List<Tag> tags = new ArrayList<>(); //一个标签对应多个博客

    @ManyToOne
    private User user;

    @OneToMany(mappedBy = "blog")  //关系被维护
    private List<Comment> comments = new ArrayList<>();

    @Transient
    private String tagIds;  
    //获取tag的id
    private String tagsToIds(List<Tag> tags) {
        if (!tags.isEmpty()) {
            StringBuffer ids = new StringBuffer();
            boolean flag = false;
            for (Tag tag : tags) {
                if (flag) {
                    ids.append(",");
                } else {
                    flag = true;
                }
                ids.append(tag.getId());
            }
            return ids.toString();
        } else {
            return tagIds;
        }
    }

2.Type实体类

分析:
需要 id 和 分类名称
定义博客变量

相关代码(省略get、set和toString方法):

/**
 * 博客分类实体
 */
@Entity
@Table(name = "t_type")
public class Type {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotBlank(message = "分类名称不能为空")
    private String name;

    @OneToMany(mappedBy = "type")
    private List<Blog> blogs = new ArrayList<>();

3.Tag实体类

分析:
需要 id 和 标签名称
定义博客变量

相关代码(省略get、set和toString方法):

/**
 * 博客标签实体类
 */
@Entity
@Table(name = "t_tag")
public class Tag {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @ManyToMany(mappedBy = "tags")
    private List<Blog> blogs = new ArrayList<>();   //一个博客对应多个标签

4.Comment实体类

分析:
主键(id)、昵称(nickname)、邮箱(email)、头像(avatar)、评论内容(content)、创建时间(createTime)、回复评论集合(replyComments)、评论(parentComment)

相关代码(省略get、set和toString方法):

/**
 * 评论实体类
 */
@Entity
@Table(name = "t_comment")
public class Comment {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)   //实现自增
    private Long id;
    private String nickname;  //昵称
    private String email;    //邮箱
    private String content;  //评论内容
    private String avatar;   //头像
    @Temporal(TemporalType.TIMESTAMP)   //获取时间
    private Date createTime;    //创建时间

    @ManyToOne
    private Blog blog;  //关系维护端  多的一端

    //自关联
    @OneToMany(mappedBy = "parentComment")    //一个父类对应多个子类
    private List<Comment> replyComment = new ArrayList<>();  //回复评论集合
    @ManyToOne
    private Comment parentComment;  //评论

5.User实体类

分析:
主键(id)、昵称(nickname)、用户名(username)、用户密码(password)邮箱(email)、头像(avatar)、类型(type)、创建时间(createTime)、更新时间(updateTime)、博客联系(blogs)

相关代码(省略get、set和toString方法):

/**
 * 用户实体类
 */
@Entity
@Table(name = "t_user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; //用户id
    private String nickname;  //用户昵称
    private String username;  //用户名
    private String password;  //用户密码
    private String email;     //用户邮箱
    private String avatar;    //用户头像
    private Integer type;     //用户类型
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTime;   //创建时间
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateTime;   //更新时间

    @OneToMany(mappedBy = "user")
    private List<Blog> blogs = new ArrayList<>();