在下用的是jpa整合Hibernate
application.yml配置
spring:
profiles:
active: dev
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/****
username: **
password: **
jpa:
hibernate:
ddl-auto: update
show-sql: true
上面是权限管理用到的表
下面放出三个实体采用JPA注解,实体均为关联实体
1 User实体
package com.example.demo.domain;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.HashSet;
import java.util.Set;
/**
* @Author :zhanglu
* @Description:
* @Date :Created in 15:18 2017/11/13
* @Modified By:
*/
@Entity
@Table(name = "t_user")
public @Data
class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NotEmpty(message = "用户名不能为空")
private String username;
@NotEmpty(message = "密码不能为空")
private String password;
// 将与他关联的书
@ManyToMany(fetch= FetchType.LAZY)
@JoinTable(name = "t_user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = {
@JoinColumn(name = "role_id") })
private Set<Role> roleList;// 一个用户具有多个角色
public User() {
super();
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
// 省略 get set 方法
@Transient
public Set<String> getRolesName() {
Set<Role> roles = getRoleList();
Set<String> set = new HashSet<String>();
for (Role role : roles) {
set.add(role.getRolename());
}
return set;
}
}
2 Role实体
package com.example.demo.domain;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.HashSet;
import java.util.Set;
/**
* @Author :zhanglu
* @Description:
* @Date :Created in 15:20 2017/11/13
* @Modified By:
*/
@Entity
@Table(name = "t_role")
public @Data
class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String rolename;
@OneToMany(mappedBy = "role", fetch= FetchType.EAGER)
private Set<Permission> permissionList;// 一个角色对应多个权限
@ManyToMany
@JoinTable(name = "t_user_role", joinColumns = { @JoinColumn(name = "role_id") }, inverseJoinColumns = {
@JoinColumn(name = "user_id") })
private Set<User> userList;// 一个角色对应多个用户
// 省略 get set 方法
@Transient
public Set<String> getPermissionsName() {
Set<String> list = new HashSet<>();
Set<Permission> perlist = getPermissionList();
for (Permission per : perlist) {
list.add(per.getPermissionname());
}
return list;
}
}
3Permission
package com.example.demo.domain;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
/**
* @Author :zhanglu
* @Description:
* @Date :Created in 15:21 2017/11/13
* @Modified By:
*/
@Entity
@Table(name = "t_permission")
public @Data
class Permission {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String permissionname;
@ManyToOne
@JoinColumn(name = "role_id")
private Role role;// 一个权限对应一个角色
// 省略 get set
}
二Dao层
package com.example.demo.Repository;
import com.example.demo.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* @Author :zhanglu
* @Description:
* @Date :Created in 13:59 2017/11/6
* @Modified By:
*/
public interface UserRepository extends JpaRepository<User,Integer> {
public User findUserByUsername(String currentLoginName);
public List<User> findAll();
}
三、Service
public User findByLoginName(String currentLoginName){
return userRepository.findUserByUsername(currentLoginName);
}
Controler调用Service的时候就出现栈溢出
原因是我的实体里面查一个用户就必须差出他的角色,查出角色又要查权限,而角色又要查用户,而用户名是无法查出角色的,id才可以此时栈存的就只是角色的引用,就发生了栈溢出。
最后,建议关联表多就不要用jpa的toMany等注解。