簡體   English   中英

JPA多對多關系創建兩個連接表

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

我試圖在UserFileObject類之間創建多對多關系,假設用戶可以訪問許多文件對象,文件對象可以被許多用戶和一對多關系訪問,因為一個用戶可以擁有多個文件但是一個文件只能由一個用戶擁有。 這是我的代碼:

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

理論上它應該只創建一個連接表,即USER_FILE_ACCESS,但是當我運行腳本時,它會創建兩個連接表,我不知道為什么。

以下是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    |       |
+------------------+---------+------+-----+---------+-------+

如何使連接表只有一個表?

如果你想要雙向關系,那么:

@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而不是List。

您還可以嘗試另一種雙向選項。 所以在非擁有方面,您將映射如下:

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

另外,仔細檢查列名稱。我可能會在數據庫中添加一些不同的內容。

暫無
暫無

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

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