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

Java JPA多对多关系创建两个联接表,java,mysql,jpa,orm,eclipselink,Java,Mysql,Jpa,Orm,Eclipselink,我试图在User和FileObject类之间创建多对多关系,假设用户可以访问多个文件对象,文件对象可以被多个用户访问,并且一对多关系是一个用户可以拥有多个文件,但一个文件只能由一个用户拥有。这是我的密码: @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.TABLE) public int id; public String firstname; publi

我试图在
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>();
}

如何使联接表成为唯一的一个表?

如果希望具有双向关系,则:

@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;
@实体
公共类用户{
@许多
@JoinTable(name=“USER\u FILE\u ACCESS”
joinColumns=@JoinColumn(name=“user\u id”),
inverseJoinColumns=@JoinColumn(name=“fileHasAccess\u ID”))
公共设置文件访问;
@实体
公共类文件对象{
@许多
@JoinTable(name=“USER\u FILE\u ACCESS”
joinColumns=@JoinColumn(name=“fileHasAccess\u ID”),
inverseJoinColumns=@JoinColumn(name=“user\u id”))
公共集listUserAccessor;
更新

尝试使用集合而不是列表

您还可以尝试另一个双向选项。因此,在非拥有方,您将映射如下:

@ManyToMany(mappedBy = "fileHasAccess")
public Set<User> listUserAccessor;
@ManyToMany(mappedBy=“fileHasAccess”)
公共集listUserAccessor;

另外,请仔细检查列名。我可能在数据库中放置了与您实际拥有的不同的内容。

您的第二个@ManyToMany没有联接表/映射人。请查看it@XtremeBaumer我在一些示例中看到,对于联接表的另一端,我不需要注释CMIIWit仍然不起作用,而是给出了这样的注释未知表和连接表的me错误不存在指定mappedBy使其成为双向的,而不是单向的。如果您希望它使用在“other”端指定的映射而不是复制它,请添加mappedBy更正它是另一种将其声明为双向的方式的示例..我想我今天需要休息..使用集合tead列表是出于性能的考虑。“mappedBy”是生成一个技术表的关键。双向的两边不是完全对称的,一个是对称的master@MaciejKowalski为什么用set而不是list?无论如何,答案是thx
@ManyToMany(mappedBy = "fileHasAccess")
public Set<User> listUserAccessor;