Hibernate:如何映射到静态表?
Posted
技术标签:
【中文标题】Hibernate:如何映射到静态表?【英文标题】:Hibernate: How to map to static table? 【发布时间】:2014-02-03 20:16:45 【问题描述】:我有角色和权限表以及使用注释的连接表 role_permission:
@OneToMany
@JoinTable(name="ROLE_PERMISSION", joinColumns=@JoinColumn(name="role_id"),
inverseJoinColumns=@JoinColumn(name="permission_id"))
ROLE ROLE_PERMISSION PERMISSION (Static)
-------- ----------- --------
id ------------------ role_id
rolename permission_id ----- id
description permission_name
--------- ---------- --------
问题是,权限已经填满了记录,应该是只读的。
如何填充 ROLE_PERMISSION 连接表而不需要另一个对象,也不必在静态权限表中存储数据?
非常感谢一些专家的建议。
【问题讨论】:
您可能必须使用 DTO。为了更准确地创建一个 DTO 对象,假设 ROLE_PERMISSIONDto,它将仅包含 Role 和权限对象,并尝试使用 HibernateTransformer
转换您的查询结果。
除非你真的需要它是应用程序级别的,否则我会直接在数据库中进行。只需编写一个将在应用程序启动时执行的 SQL 脚本。
嗨@Amogh - 我只需要在 ROLE_PERMISSION 表上写。
嗨@SpartanElite-它确实应该在应用程序级别。
【参考方案1】:
这就是我实现它的方式,如果你想要一个 OnetoMany 依赖或 ManyToMany 依赖 User-> Role,请适合自己。
所以基本思路是:
在数据库中创建表 User & SystemRole,并在静态表 SystemRole 中添加条目。
确保 SystemRole 没有构造函数来实例化任何角色。
当您想将任何角色与用户相关联时,只需使用将输入作为用户名并返回用户角色对象的方法。 只需使用查询来检索这些详细信息,我没有在此处添加这些详细信息,因为我使用的是使用 CrudRepository 的 Springboot 应用程序。
最后确保依赖项(manytomany/onetoMany)没有级联类型,因为 Systemrole 已经保存。
User.java:
import java.util.Set;
import javax.persistence.*;
@Entity
@Table(name = "User")
public class User
public User()
public User(String name, Set<SystemRole> roles)
this.name = name;
this.roles = roles;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private boolean enabled;
@ManyToMany
private Set<SystemRole> roles;
public Set<SystemRole> getRoles()
return roles;
public void setRoles(Set<SystemRole> roles)
this.roles = roles;
public int getId()
return id;
public void setId(int id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
@Transient
public boolean isEnabled()
return enabled;
@Column(name = "ENABLED")
public int isEnabledasInt()
return enabled ? 1 : 0;
public void setEnabled(int enabled)
this.enabled = (1 == enabled) ? true : false;
SystemRole.java:
package com.spring.security.model;
import javax.persistence.*;
@Entity
@Table(name = "System_Role")
public class SystemRole
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private SystemRole()
public int getId()
return id;
public void setId(int id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
@Override
public boolean equals(Object o)
if (this == o) return true;
if (!(o instanceof SystemRole)) return false;
SystemRole that = (SystemRole) o;
if (getId() != that.getId()) return false;
return getName().equals(that.getName());
@Override
public int hashCode()
int result = getId();
result = 31 * result + getName().hashCode();
return result;
【讨论】:
以上是关于Hibernate:如何映射到静态表?的主要内容,如果未能解决你的问题,请参考以下文章
如何将多个值类型集合映射到 Hibernate 中的一个表?