最近在写一个博客项目,数据库表的建立要考虑多表的问题,记录下学习所得!
CRUD create read update delete
实体类的设计:
Article: articleId title content createDate author(User类型 多对一关系维护端) category(Category类型 多对一关系维护端)
comment(Set<Comments>类型 一对多)
Category: categoryId name displayName articles(Set<Article>类型 一对多)
Comments: commentId comment article(Article类型-评论对应的文章 多对一关系维护端)
User: uid username password sex birthday phone email address discription(个人介绍) roles(Set<Role> 多对多)
Role: rid name discription users(Set<User> 多对多)
希望达到的目的,加载文章的时候可以加载出全部的评论(评论可有可无,但评论不能单独存在,必须有对应的文章),可以根据分类直接查询对应的所有文章,文章必须分类,但用户可以增加新的分类,在删除用户的时候,角色表不能动,暂时想到这么多。。。
准备测试多对多关系时,又有了新的想法,我希望可以单独添加角色,但是添加用户时必须要有相应的角色,默认的角色为游客,一个用户可以有一到多个角色,一个角色可以没有用户,而不同的角色又有不同的权限,权限包括添加、删除、修改,游客只能浏览,普通用户可以增删改自己的博客,管理员具备管理普通用户的权限,超级管理员具备管理管理员的权限。。。
实体类:
Article.java
@Entity //指定一个实体类
@Table(name = "t_article") //指定表名
public class Article {
@Id //指定主键
@GenericGenerator(name = "generator",strategy = "native") //声明主键生成策略
@GeneratedValue(generator = "generator") //设定主键生成策略
@Column(name = "article_id") //类中的属性和表中的列名的对应关系,默认为表字段名与实体类属性名一致
private Long articleId;
private String title;
@Column(columnDefinition = "text")
private String content;
@Column(columnDefinition = "text")
private String summary;
@ManyToOne //指定多对一的关系
@JoinColumn(name="author_id") //设置外键
private User author; //一篇文章对应于一个作者,所以这里不用集合
@Column(name = "create_date")
private String createDate; //创建日期
@ManyToOne
@JoinColumn(name = "category_id") //不管是一对多还是多对一,都让多的一方维护关系
private Category category; //表示多篇博客属于同一个分类
@OneToMany(cascade=CascadeType.ALL,mappedBy = "article")
@OrderBy(value = "commentId asc") //按id升序排列
private Set<Comments> comments; //一篇文章对应多个评论,加载文章的时候能加载出评论
//这里省略getter和setter方法
}
Category.java
@Entity
@Table(name = "t_category")
public class Category {
@Id
@GenericGenerator(name = "generator",strategy = "native")
@GeneratedValue(generator = "generator")
@Column(name="category_id")
private Long categoryId;
private String name;
@Column(name = "display_name")
private String displayName;
@OneToMany(cascade=CascadeType.ALL,mappedBy = "category")
@OrderBy(value = "articleId asc ")
private Set<Article> articleSet = new HashSet<>();
//省略getter和setter
}
Comments.java
@Entity
@Table(name = "t_comments")
public class Comments {
@Id
@GenericGenerator(name = "generator", strategy = "native")
@GeneratedValue(generator = "generator")
@Column(name = "comment_id")
private Long commentId;
@ManyToOne(cascade = CascadeType.ALL,optional = false) //option=false表示文章不能不存在
@JoinColumn(name="article_id")
private Article article; //评论对应的文章
@Column(columnDefinition = "text")
private String comment; //评论内容
//省略getter和setter
}
User.java
@Entity
@Table(name = "t_user")
public class User {
@Id
@GenericGenerator(name = "generator", strategy = "native")
@GeneratedValue(generator = "generator")
private Long uid;
@Column(name = "username",nullable = false)
private String username;
@Column(name = "password",nullable = false)
private String password;
@Column(name = "email", nullable = false)
private String email;
private String sex;
private String birthday;
private String address;
private String phone;
@Column(columnDefinition = "text")
private String description; //用户的个人简介
@ManyToMany
//两者的关系表,由两者的主键ID组成,joinColumns指定主表的外键,inverseJoinColumns指定匹配表的外键
@JoinTable(name = "tb_user_role", joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>(); //用户拥有的不同角色
//省略getter和setter
}
Role.java
@Entity
@Table(name = "t_role")
public class Role {
@Id
@GenericGenerator(name = "generator",strategy = "native")
@GeneratedValue(generator = "generator")
private Long rid;
private String name;
private String discription; //角色描述
@ManyToMany(mappedBy="roles")
private Set<User> users = new HashSet<>();
//省略getter和setter
}
建立测试类,hibernate自动为我们建立了表,查看生成的数据库表(以及自动生成的sql语句):