我有两张桌子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,而不是用户对象本身。
答案 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