深入实践Spring Boot2.1.2 实体建模

    xiaoxiao2024-05-18  106

    2.1.2 实体建模

    首先创建一些普通对象,用来与数据库的表建立映射关系,接着演示如何使用JPA对数据库进行增删查改等存取操作。

    假如现在有三个实体:部门、用户和角色,并且它们具有一定的关系,即一个用户只能隶属于一个部门,一个用户可以拥有多个角色。它们的关系模型如图2-1所示。

     

    图2-1 MySQL实体-关系模型示例

    Spring Boot的实体建模与使用Spring框架时的定义方法一样,同样比较方便的是使用了注解的方式来实现。

    部门实体的建模如代码清单2-2所示,其中注解@Table指定关联的数据库的表名,注解@Id定义一条记录的唯一标识,并结合注解@GeneratedValue将其设置为自动生成。部门实体只有两个字段:id和name。程序中省略了Getter和Setter方法的定义,这些方法可以使用IDEA的自动生成工具很方便地生成。

    代码清单2-2 部门实体建模

    @Entity

    @Table(name = "deparment")

    public class Deparment {

        @Id

        @GeneratedValue(strategy = GenerationType.IDENTITY)

        private Long id;

        private String name;

     

        public Deparment() {

        }

            ……

    }

    用户实体包含三个字段:id、name和createdate,用户实体建模如代码清单2-3所示。其中注解@ManyToOne定义它与部门的多对一关系,并且在数据库表中用字段did来表示部门的ID,注解@ManyToMany定义与角色实体的多对多关系,并且用中间表user_role来存储它们各自的ID,以表示它们的对应关系。日期类型的数据必须使用注解@DateTimeFormat来进行格式化,以保证它在存取时能提供正确的格式,避免保存失败。注解@JsonBackReference用来防止关系对象的递归访问。

    代码清单2-3 用户实体建模

    @Entity

    @Table(name = "user")

    public class User implements java.io.Serializable{

        @Id

        @GeneratedValue(strategy = GenerationType.IDENTITY)

        private Long id;

        private String name;

        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

        private Date createdate;

     

        @ManyToOne

        @JoinColumn(name = "did")

        @JsonBackReference

        private Department deparment;

     

        @ManyToMany(cascade = {}, fetch = FetchType.EAGER)

        @JoinTable(name = "user_role",

                joinColumns = {@JoinColumn(name = "user_id")},

                inverseJoinColumns = {@JoinColumn(name = "roles_id")})

        private List<Role> roles;

     

        public User() {

        }

    ……

    角色实体建模比较简单,只要按设计的要求,定义id和name字段即可,当然同样必须保证id的唯一性并将其设定为自动生成。角色实体的建模如代码清单2-4所示。

    代码清单2-4 角色实体建模

    @Entity

    @Table(name = "role")

    public class Role implements java.io.Serializable{

        @Id

        @GeneratedValue(strategy = GenerationType.IDENTITY)

        private Long id;

        private String name;

     

        public Role() {

        }

    ……

    最新回复(0)