簡體   English   中英

休眠多對多單向映射

[英]Hibernate Many To Many unidirectional mapping

我有兩個表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,而不能擁有用戶對象本身。

您可以使用以下結構進行管理。

用戶:

@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
}

您可以使用@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關系回到用戶,以及@OneToOne關系回到File類。 在這里,您可以存儲有關權限用戶擁有的詳細信息,在這種情況下,我有一個枚舉。

您的File類很簡單:

@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM