JPA 多对多关系创建两个连接表
JPA Many to Many Relationship Creates Two Join Tables
我正在尝试在 User
和 FileObject
类 之间创建多对多关系,假设用户可以访问许多文件对象,文件对象可以通过以下方式访问许多用户和一对多关系,因为一个用户可以拥有多个文件,但一个文件只能由一个用户拥有。这是我的代码:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
public int id;
public String firstname;
public String lastname;
public String publicAttributes;
public String privateAttributes;
@ManyToOne
private Department department;
@OneToMany(mappedBy = "user")
public List<Device> devices = new ArrayList<Device>();
@OneToMany(mappedBy = "userCreator")
public List <FileObject> fileOwned = new ArrayList <FileObject>();
@ManyToMany
@JoinTable(name="USER_FILE_ACCESS")
public List<FileObject> fileHasAccess = new ArrayList<FileObject>();
}
@Entity
public class FileObject {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
public int id;
String checksum;
@OneToMany(mappedBy = "fileObject")
public List<Policy> policies = new ArrayList<Policy>();
byte[] encryptedFileKey;
byte[] iv;
@ManyToOne
public User userCreator;
@ManyToMany
public List<User> listUserAccessor = new ArrayList<User>();
}
理论上它应该只创建一个连接 table 即 USER_FILE_ACCESS 但是当我 运行 脚本然后它创建两个连接 table 我不确定为什么。
以下是 SQL 命令的摘录:
show tables;
+------------------+
| Tables_in_cpabe |
+------------------+
| DEPARTMENT |
| DEVICE |
| FILEOBJECT |
| FILEOBJECT_USER |
| POLICY |
| SEQUENCE |
| USER |
| USER_FILE_ACCESS |
+------------------+
show columns from FILEOBJECT_USER;
+---------------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------+------+-----+---------+-------+
| FileObject_ID | int(11) | NO | PRI | NULL | |
| listUserAccessor_ID | int(11) | NO | PRI | NULL | |
+---------------------+---------+------+-----+---------+-------+
show columns from USER_FILE_ACCESS;
+------------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+---------+------+-----+---------+-------+
| User_ID | int(11) | NO | PRI | NULL | |
| fileHasAccess_ID | int(11) | NO | PRI | NULL | |
+------------------+---------+------+-----+---------+-------+
如何让 join table 成为唯一一个 table?
如果你想建立 bi-directional 关系,那么:
@Entity
public class User {
@ManyToMany
@JoinTable(name="USER_FILE_ACCESS"
joinColumns=@JoinColumn(name="user_id"),
inverseJoinColumns=@JoinColumn(name="fileHasAccess_ID "))
public Set<FileObject> fileHasAccess;
@Entity
public class FileObject {
@ManyToMany
@JoinTable(name="USER_FILE_ACCESS"
joinColumns=@JoinColumn(name="fileHasAccess_ID"),
inverseJoinColumns=@JoinColumn(name="user_id"))
public Set<User> listUserAccessor;
更新
尝试使用 SEt 而不是列表。
您也可以尝试另一个 bi-directional 选项。因此,在参考侧或反向侧(non-owning 侧),您将映射如下:
@ManyToMany(mappedBy = "fileHasAccess")
public Set<User> listUserAccessor;
此外,double-check 列名..我可能放了一些与您在数据库中实际拥有的不同的东西。
我正在尝试在 User
和 FileObject
类 之间创建多对多关系,假设用户可以访问许多文件对象,文件对象可以通过以下方式访问许多用户和一对多关系,因为一个用户可以拥有多个文件,但一个文件只能由一个用户拥有。这是我的代码:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
public int id;
public String firstname;
public String lastname;
public String publicAttributes;
public String privateAttributes;
@ManyToOne
private Department department;
@OneToMany(mappedBy = "user")
public List<Device> devices = new ArrayList<Device>();
@OneToMany(mappedBy = "userCreator")
public List <FileObject> fileOwned = new ArrayList <FileObject>();
@ManyToMany
@JoinTable(name="USER_FILE_ACCESS")
public List<FileObject> fileHasAccess = new ArrayList<FileObject>();
}
@Entity
public class FileObject {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
public int id;
String checksum;
@OneToMany(mappedBy = "fileObject")
public List<Policy> policies = new ArrayList<Policy>();
byte[] encryptedFileKey;
byte[] iv;
@ManyToOne
public User userCreator;
@ManyToMany
public List<User> listUserAccessor = new ArrayList<User>();
}
理论上它应该只创建一个连接 table 即 USER_FILE_ACCESS 但是当我 运行 脚本然后它创建两个连接 table 我不确定为什么。
以下是 SQL 命令的摘录:
show tables;
+------------------+
| Tables_in_cpabe |
+------------------+
| DEPARTMENT |
| DEVICE |
| FILEOBJECT |
| FILEOBJECT_USER |
| POLICY |
| SEQUENCE |
| USER |
| USER_FILE_ACCESS |
+------------------+
show columns from FILEOBJECT_USER;
+---------------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------+------+-----+---------+-------+
| FileObject_ID | int(11) | NO | PRI | NULL | |
| listUserAccessor_ID | int(11) | NO | PRI | NULL | |
+---------------------+---------+------+-----+---------+-------+
show columns from USER_FILE_ACCESS;
+------------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+---------+------+-----+---------+-------+
| User_ID | int(11) | NO | PRI | NULL | |
| fileHasAccess_ID | int(11) | NO | PRI | NULL | |
+------------------+---------+------+-----+---------+-------+
如何让 join table 成为唯一一个 table?
如果你想建立 bi-directional 关系,那么:
@Entity
public class User {
@ManyToMany
@JoinTable(name="USER_FILE_ACCESS"
joinColumns=@JoinColumn(name="user_id"),
inverseJoinColumns=@JoinColumn(name="fileHasAccess_ID "))
public Set<FileObject> fileHasAccess;
@Entity
public class FileObject {
@ManyToMany
@JoinTable(name="USER_FILE_ACCESS"
joinColumns=@JoinColumn(name="fileHasAccess_ID"),
inverseJoinColumns=@JoinColumn(name="user_id"))
public Set<User> listUserAccessor;
更新
尝试使用 SEt 而不是列表。
您也可以尝试另一个 bi-directional 选项。因此,在参考侧或反向侧(non-owning 侧),您将映射如下:
@ManyToMany(mappedBy = "fileHasAccess")
public Set<User> listUserAccessor;
此外,double-check 列名..我可能放了一些与您在数据库中实际拥有的不同的东西。