如何创建带有JPA注释的连接表?

2022-09-01 07:36:51

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

enter image description here

到目前为止,我只实现了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;
    }
}

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

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


答案 1

您绝对不应该创建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<User> users;

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

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

答案 2

我会这样实现它:

@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<User> users;
}

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


推荐