Hibernate:如何映射到静态表?

3

我有一个角色表和权限表,使用注解连接起来的联接表是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和permission对象,并尝试使用Hibernate“Transformer”转换查询结果。 - Amogh
除非你真的需要它在应用程序级别上运作,否则我建议直接在数据库中完成。只需编写一个 SQL 脚本,在应用程序启动时执行即可。 - SpartanElite
嗨@Amogh - 我只需要在ROLE_PERMISSION表上写入。 - juls pp
嗨@SpartanElite-它应该真正在应用程序层中。 - juls pp
1个回答

0

这是我实现它的方式,请根据自己的需要选择OneToMany依赖关系或ManyToMany依赖关系User-> Role。

所以基本思路是:

  1. 在数据库中创建User和SystemRole表,并向静态表SystemRole添加条目。

  2. 确保SystemRole没有构造函数来实例化任何角色。

  3. 每当您想将任何角色与用户关联时,只需使用一个方法,该方法将以用户名作为输入并返回UserRole对象。只需使用查询检索这些详细信息,因为我正在使用使用CrudRepository的Springboot应用程序,因此我没有在此处添加这些详细信息。

  4. 最后确保依赖关系(many-to-many/one-to-many)没有级联类型,因为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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接