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;