Hibernate Many To Many单向映射

时间:2017-03-12 20:17:50

标签: java hibernate many-to-many

我有两张桌子USERS和FILES。我希望能够控制可以下载文件的用户,为此我正在考虑使用user_id和file_id创建和中间表FILE_PERMISSIONS。

查看数据库级别我理解如何解决问题,但是在Hibernate级别上升,我真的不明白应该如何映射这种关系。我看待它的方式是这样的:

public class User {
   private Integer userId;
}

public class File {
   private Integer fileId;
   private List<Integer> userIds;
}

所以我希望我的File对象知道可以下载文件的所有用户的id属性,反之亦然,以便用户不知道这些文件。

从我读到的内容我可以使用多对多的单向关系,但我不确定我只能拥有用户的id,而不是用户对象本身。

2 个答案:

答案 0 :(得分:2)

您可以使用以下结构进行管理。

用户:

@Entity
public class User {
    @Id
    private Integer userId;

    // getters, setters
}

文件:

@Entity
public class File {
    @Id
    private Integer fileId;

    @ManyToMany
    @JoinTable(
            name = "file_permissions",
            joinColumns = @JoinColumn(name = "file_id"),
            inverseJoinColumns = @JoinColumn(name = "user_id")
    )
    private Set<User> users;

    // getters, setters
}

答案 1 :(得分:1)

您可以使用@OneToMany关系来设计更简单的设计。这样,您可以创建服务以管理文件权限,而不是依靠用户服务或文件服务来执行此操作。

我提出的建议如下:

User.java

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Version
    private Integer version;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", orphanRemoval = true)
    private List<FilePermissions> filePermissionsList= new ArrayList<>();


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public List<FilePermissions> getFilePermissionsList() {
        return filePermissionsList;
    }

    public void setFilePermissionsList(List<FilePermissions> filePermissionsList) {
        this.filePermissionsList = filePermissionsList;
    }
}

注意用户有一个FilePermissions列表。

你的FilePermission类应该是:

@Entity
public class FilePermissions {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Version
    private Integer version;

    @ManyToOne
    private User user;

    @OneToOne
    private File file;

    private Permission permission;


    public FilePermissions() {

    }

    public FilePermissions(User user, File file, Permission permission) {
        this.user = user;
        this.file = file;
        this.permission = permission;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public Permission getPermission() {
        return permission;
    }

    public void setPermission(Permission permission) {
        this.permission = permission;
    }
}

注意回到用户的@ManytoOne关系,以及与File类的@OneToOne关系。在这里,您可以存储用户拥有权限的详细信息,在这种情况下,我有一个枚举。

您的文件类是直截了当的:

@Entity
public class File {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Version
    private Integer version;

    private String name;

    public File() {}

    public File(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

您可以在此处详细了解解决方案:https://github.com/ccoloradoc/HibernateFilePermissionSample