hibernate一对多、多对一、多对多问题

最近在写一个博客项目,数据库表的建立要考虑多表的问题,记录下学习所得!

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语句):

 

 

 

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值