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;