【问题标题】:JPA Many to Many Relationship Creates Two Join TablesJPA 多对多关系创建两个连接表
【发布时间】:2017-06-23 12:10:37
【问题描述】:

我正在尝试在 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    |       |
+------------------+---------+------+-----+---------+-------+

如何让连接表只有一个表?

【问题讨论】:

  • 您的第二个 @ManyToMany 没有连接表/映射。也许看看它
  • @XtremeBaumer 我在一些可用于连接表另一侧的示例中看到我不需要该注释 CMIIW

标签: java mysql jpa orm eclipselink


【解决方案1】:

如果你想建立双向关系,那么:

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

另外,请仔细检查列名.. 我可能放了一些与您在数据库中实际拥有的不同的东西。

【讨论】:

  • 它仍然不起作用,而是给出了一些未知表的错误,并且连接表不存在
  • 指定 mappedBy 使其成为双向的,而不是单向的。如果您希望它使用在“另一端”指定的映射而不是复制它,则添加 mappedBy
  • 更正它的另一个例子,说明它是双向的..我想我今天需要休息一下..
  • 使用 Set 代替 List 是出于性能原因。 “mappedBy”是生成一张技术表的关键。双向的两边不完全对称,一个为主
  • @MaciejKowalski 为什么使用集合而不是列表?无论如何谢谢你的答案
猜你喜欢
  • 2014-09-12
  • 2016-11-10
  • 2021-07-12
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 2018-11-06
相关资源
最近更新 更多