如何使用JPA注释创建连接表?

我需要使用JPA注释在我的数据库中创建一个连接表,结果将是这样的:

在此处输入图像描述

到目前为止,我刚刚实施了2个实体

 @Entity @Table(name="USERS", schema="ADMIN") public class User implements Serializable { private static final long serialVersionUID = -1244856316278032177L; @Id @Column(nullable = false) private String userid; @Column(nullable = false) private String password; public String getUserid() { return userid; } public void setUserid(String userid) { this.userid = userid; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } 

 @Entity @Table(name="GROUPS", schema="ADMIN") public class Group implements Serializable { private static final long serialVersionUID = -7274308564659753174L; @Id @Column(nullable = false) private String groupid; public String getGroupid() { return groupid; } public void setGroupid(String groupid) { this.groupid = groupid; } } 

我应该创建另一个名为USER_GROUP实体,或者我可以添加一些注释,这样当我从实体(ORM)运行创建表时,会自动创建连接表吗?

我应该如何注释我的实体以达到与图像相同的效果?

你绝对不应该创建User_Group实体,因为它更像是基础数据库表示而不是面向对象的实体。

您可以通过定义以下内容来实现连接表:

 @Entity @Table(name="USERS", schema="ADMIN") public class User implements Serializable { //... @ManyToOne @JoinTable(name="USER_GROUP") Group group; 

 @Entity @Table(name="GROUPS", schema="ADMIN") public class Group implements Serializable { //... @OneToMany(mappedBy="group") Set users; 

编辑:如果要显式设置列的名称,可以使用@JoinColumn元素,如下所示:

 @ManyToOne @JoinTable(name="USER_GROUP", joinColumns = @JoinColumn(name = "userid", referencedColumnName = "userid"), inverseJoinColumns = @JoinColumn(name = "groupid", referencedColumnName = "groupid")) Group group; 

我会这样实现它:

 @Entity @Table(name="GROUPS", schema="ADMIN") public class Group implements Serializable { @OneToMany @JoinTable(name = "USER_GROUP", joinColumns = @JoinColumn(name = "groupid"), inverseJoinColumns = @JoinColumn(name = "userid")) private List users; } 

@PedroKowalski建议的解决方案也应该有效,但是您必须在用户实体中保留对Group实体的引用,这并不总是可行的。

要在图表中使用相同的注释,可以在User类中执行此User

 @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "USER_GROUP", joinColumns = { @JoinColumn(name = "userid") }, inverseJoinColumns = { @JoinColumn(name = "groupid") }) private List grups; 

在你的小组课上

 @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "USER_GROUP", joinColumns = { @JoinColumn(name = "groupid") }, inverseJoinColumns = { @JoinColumn(name = "userid") }) private List users; 

我想知道以这种方式创建连接表有什么意义,考虑到我们无法直接访问查询? JPA不允许直接向Join Table进行查询,因此如果用户想要对USER_GROUP进行操作,他必须在用户之间进行正常的连接查询; 因此,连接表USER_GROUP是无用的。