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 和权限对象,并尝试使用 Hibernate Transformer 转换您的查询结果。 除非你真的需要它是应用程序级别的,否则我会直接在数据库中进行。只需编写一个将在应用程序启动时执行的 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 中的一个表?

hibernate多对多映射中间表有多余字段问题该如何映射

Hibernate注解

Hibernate 注释用法

hibernate 表名为变量的映射文件 怎么配。 如何用?

休眠。如何将条目添加到具有来自 Hibernate 中 2 个不同表的 2 个外键的表中?