简体   繁体   English

JPA多对多关系创建两个连接表

[英]JPA Many to Many Relationship Creates Two Join Tables

I am trying to create a many-to-many relationship between User and FileObject classes with the assumption user can access many file objects and file object can be accessed by many user and one-to-many relationship as one user can own many files but one file can only be owned by one user. 我试图在UserFileObject类之间创建多对多关系,假设用户可以访问许多文件对象,文件对象可以被许多用户和一对多关系访问,因为一个用户可以拥有多个文件但是一个文件只能由一个用户拥有。 Here is my code: 这是我的代码:

@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>();
}

In theory it should only create one join table namely USER_FILE_ACCESS but when I ran the script then it creates two join tables and I am not sure why. 理论上它应该只创建一个连接表,即USER_FILE_ACCESS,但是当我运行脚本时,它会创建两个连接表,我不知道为什么。

Here are the excerpt of the SQL commands: 以下是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    |       |
+------------------+---------+------+-----+---------+-------+

How do I make join table to be only one table? 如何使连接表只有一个表?

If you want to have a bi-directional relationship then: 如果你想要双向关系,那么:

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

Update 更新

Try to use SEt instead of a List. 尝试使用SEt而不是List。

And you can also try another bi-directional option. 您还可以尝试另一种双向选项。 So on the non-owning side, you would map as follows: 所以在非拥有方面,您将映射如下:

@ManyToMany(mappedBy = "fileHasAccess")
public Set<User> listUserAccessor;

Also, double-check the column names .. I may have put something different then what you actually have in the DB. 另外,仔细检查列名称。我可能会在数据库中添加一些不同的内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM