开发踩坑日志2 jpa权限相关

1.jpa 用户,角色,权限的关系
用户=》角色
OneToMany :每个用户都拥有专属自己的角色
ManyToMany:一个角色也可以被多个用户拥有
角色=》权限 ManyToMany

package com.chy.gk.model.uesr;


import javax.persistence.*;
import java.util.Set;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    //用户编号
    private long id;
    //用户名
    @Column(name = "user_name", nullable = false)
    private String userName;
    //密码
    @Column(name = "password", nullable = false)
    private String password;
    //手机号码
    @Column( name = "phone_num",nullable = false)
    private String phoneNum;
    //密码盐
    private String salt;
    //角色列表
    @ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE})
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
    private Set<Role> roleSet;
package com.chy.gk.model.uesr;

import javax.persistence.*;
import java.util.Set;

@Entity
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    //角色名称
    @Column( name = "role_name", nullable = false)
    private String roleName;
    @ManyToMany(mappedBy = "roleSet")
    private Set<User> userSet;

    @ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE})
    @JoinTable(name = "role_permission", joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "permission_id", referencedColumnName = "id"))
    private Set<Permission> permissionSet;

2.mysql连接报错:时区不正确
datasource.url= jdbc:mysql://localhost:3306/gk?useUnicode=true&characterEncoding=utf-8&relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=UTC

3.jpa 报Table ‘’ doesn’t exist 不能自动创表
解决:
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

4.用户关联的角色没有保存
报Caused by: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.chy.gk.model.uesr.Role
解决:
@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE})
CascadeType.MERGE级联更新:
若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法
CascadeType.REFRESH级联刷新:
获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据
CascadeType.PERSIST级联保存:
对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法
**CascadeType.REMOVE级联删除:**对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法
CascadeType.ALL包含所有持久化方法
慎用,因为包含删除

综上:大多数情况用CascadeType.MERGE就能达到级联跟新又不报错

5.外键无法创建
报Error executing DDL “alter table user_role add constraint FKa68196081fvovjhkek5m97n3y foreign key (role_id) references role (id)” via JDBC Statement
解决:数据用户加权限
grant alter,REFERENCES on . to ‘gkdevuser’@’%’ with grant option;

你可能感兴趣的:(开发踩坑日志2 jpa权限相关)