java 在JPA嵌入式中覆盖equals()和hashcode()方法不起作用

bjp0bcyl  于 2022-12-21  发布在  Java
关注(0)|答案(2)|浏览(160)

JDK 17语言
SpringBoot最新款
JPA最新版
MySQL数据库8.0.31
我正在尝试实现一种策略,确保每个用户的姓名和电子邮件地址都是唯一的。
用户实体:

@Entity
public class User {
    ......
    @EmbeddedId
    protected UserId id;
    ......
}

用户ID:

@Embeddable
public class UserId implements Serializable {
    @Serial
    private static final long serialVersionUID = -622156255674132106L;
    @Column(name = "name", nullable = false)
    protected String name = "";
    @Column(name = "email", nullable = false)
    protected String email = "";

    public UserId(String name, String email) {
        setName(name);
        setEmail(email);
    }

    public UserId() {}

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return Objects.requireNonNullElse(name, "");
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return Objects.requireNonNullElse(email, "");
    }
}

现在,默认情况下,只有当userA.name == userB.name && userA.email == userB.email时,它才被标记为冲突,这意味着可以有两个用户拥有相同的电子邮件地址,只要他们不共享一个单一的名称。如何阻止这种情况发生?我期望的是userA.name == userB.name || userA.email == userB.email
我尝试过用下面的方法覆盖equals()hashcode()

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof UserId userId)) return false;

    if (Objects.equals(name, userId.name)) return true;
    return Objects.equals(email, userId.email);
}

@Override
public int hashCode() {
    int result = name != null ? name.hashCode() : 0;
    result = 31 * result + (email != null ? email.hashCode() : 0);
    return result;
}

但是,它不起作用。而且,这两个函数内部的断点也没有到达。
=========编辑=========
原来的问题解决了,但是UsersRepository.existsById()两列有一列不匹配,还是不存在,怎么解决?

gj3fmq9x

gj3fmq9x1#

无论是通过注解和模式生成,还是直接创建/修改模式,答案都是一样的。
您需要在数据库中创建一个唯一的约束来命名这两列,而不是两个单独的约束。
如果您希望模式生成注解完成此操作,请为@Table注解提供@UniqueConstraint注解,例如

@Table(uniqueConstraints = { 
 @UniqueConstraint(columnNames = {
   "name", "email" 
 }) 
})
toiithl6

toiithl62#

public class UserId implements Serializable {
    @Serial
    private static final long serialVersionUID = -622156255674132106L;
    @Column(name = "name", nullable = false, unique=true)
    protected String name = "";
    @Column(name = "email", nullable = false, unique=true)
    protected String email = "";

相关问题