一、实体设计
1.实体类:
- 博客 Blog
- 博客分类 Type
- 博客标签 Tag
- 博客评论 Comment
- 用户 User
2.实体之间的关系:
- 博客-分类:一篇博客只能属于一个分类,一个分类中可以有多篇博客
- 博客-标签:一篇博客可以有多个标签,一个标签内也可有多篇博客
- 博客-用户:一篇博客只能属于一个用户,一个用户可以有多篇博客
- 博客-评论:一篇博客可以有多个评论,一个评论只能在一篇博客
3.评论类自关联关系:
- 评论 :parentComment
- 评论回复:replyComment
- 每个parentComment(评论) 可以有多个replayComment(评论回复)
二、实体类构建(使用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的多表查询和相关功能
相关代码(省略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<>();