JPA如何在@OneToMany关系的列上添加唯一约束,例如在用户名上

Seb*_*nne 6 java hibernate jpa

我有一个Site代表网站和类的类User.A Site可以有多个Users.

class Site {

    private int site_ID;

    @OneToMany // with a join table
    private List<User> users;
    // ...
}

class User {

    private int user_ID;

    private String name;

    private String lastname;

    private String username;

    private String password;

}
Run Code Online (Sandbox Code Playgroud)

我想允许所有网站上存在相同的用户名,但只允许一个网站存在.

Site/User/username
1   /1   /username1
1   /2   /username2
2   /3   /username1
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Sea*_*oyd 8

让用户拥有站点参考:

@ManyToOne(optional=false)
private Site site;
Run Code Online (Sandbox Code Playgroud)

现在将约束添加到用户:

@Table(uniqueConstraints = {
    @UniqueConstraint(columnNames = { "username", "site" }))
} @Entity
public class User{
// etc
}
Run Code Online (Sandbox Code Playgroud)

您还必须更改站点映射:

@OneToMany(mappedBy="site")
private List<User> users;
Run Code Online (Sandbox Code Playgroud)


ato*_*toy 6

默认情况下,连接表上的主索引是唯一的,并且基于站点和用户FK因此,您不能让同一用户具有相同的站点重复.

但是如果你想强制约束:

class Site {

    private int site_ID;

    @OneToMany // with a join table
    @JoinTable(
        uniqueConstraints=@UniqueConstraint(columnNames={"Site_ID","users_ID"})
    )
    private List<User> users;
    // ...
}
Run Code Online (Sandbox Code Playgroud)