如何使用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是无用的。