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

编程入门 行业动态 更新时间:2024-10-24 07:28:41
本文介绍了JPA多对多关系创建两个联接表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试在User和FileObject类之间创建多对多关系,并假设用户可以访问许多文件对象,并且文件对象可以被许多用户访问,并且一对多关系如下一个用户可以拥有多个文件,但一个文件只能由一个用户拥有.这是我的代码:

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

从理论上讲,它应该只创建一个联接表,即USER_FILE_ACCESS,但是当我运行脚本时,它将创建两个联接表,我不确定为什么.

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.

以下是SQL命令的摘录:

Here are the excerpt of the SQL commands:

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;

更新

尝试使用SEt而不是列表.

Try to use SEt instead of a 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.

更多推荐

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

本文发布于:2023-10-28 18:31:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1537432.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:两个   关系   JPA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!