Spring Boot JPA与多表一对多和一对多

时间:2018-10-20 18:41:27

标签: spring-boot hibernate-mapping

我有5个表,一个用户可以有多个模块/角色/工厂。 user_master是具有用户详细信息的主表,而user_roles是具有模块/角色/工厂详细信息的子表。我的疑问是如何在模型类中编写关系。

user_master
------------
user_id int(10) unsigned
first_name  varchar(50)
last_name   varchar(50)
mail_id varchar(80)
user_status tinyint(4)
is_deleted  tinyint(4)
created_by  int(10)
created_date    date
modified_by int(10)
modified_date   date

user_roles
-----------
user_role_id    int(10) unsigned
user_id int(10) unsigned
module_master_id    int(10) unsigned
role_master_id  int(10) unsigned
plant_master_id int(10) unsigned

module_master:
module_master_id    int(10) unsigned
module_code int(10)
module_name varchar(50)
active_flag tinyint(4)

role_master:
role_master_id  int(10) unsigned
module_master_id    int(10) unsigned
role_code   int(10)
role_name   varchar(50)
active_flag tinyint(4)

plant_master:
plant_master_id int(10) unsigned
plant_code  int(10)
plant_name  varchar(50)
active_flag tinyint(4)

其余模块/角色/工厂具有其自己的主服务器,master_id是主表的主键。

我只想编写user_masteruser_roles模型类。需要一对多和多对一映射。

1 个答案:

答案 0 :(得分:0)

对于一对多的实体类,您可以像下面这样:

    用户实体中的
  1. @OneToMany

    @OneToMany(mappedBy = "user")
    private List<Role> roles;
    
  2. @ManyToOne在角色方面

    @ManyToOne
    @JoinColumn(name = "user")
    private User user;
    

    @ManyToMany

    @ManyToMany(cascade = { 
        CascadeType.PERSIST, 
        CascadeType.MERGE
    })
    @JoinTable(name = "user_role",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    private List<Role> roles= new ArrayList<>();
    

和角色方面:

    @ManyToMany(mappedBy = "role")
    private List<User> users = new ArrayList<>();

下面是一个示例,其中包含很多:

    @Entity
    public class UserRoleMaster implements Serializable {

    @EmbeddedId
    private UserRoleMasterId id;

    @ManyToOne
    @JoinColumn(name = "user_master_id", referencedColumnName = "user_master_id", insertable = false, updatable = false)
    private UserMaster userMaster;

    @ManyToOne
    @JoinColumn(name = "user_roles_id", referencedColumnName = "user_roles_id", insertable = false, updatable = false)
    private UserRoles userRoles;

    //getter  //setter //constructures

       @Embeddable
       public static class UserRoleMasterId implements Serializable {

        @Column(name = "user_master_id")
        protected Long userMasterId;

        @Column(name = "user_roles_id")
        protected Long userRolesId;
       //constrcture //getter //setters
   }
 }