hibernate 重写equals方法与hashCode方法

  • 对数据库而言,其识别一条记录的唯一性的方式是根据主键值,如果有两条记录,它们拥有同样的主键值,则它们在数据库中代表同一字段的记录。
  • 对java而言要识别两个对象是否为同一对象有两种方式
    1.内存地址识别(“==”号识别)。
    2.根据equals()、hashCode()中的定义识别。

    在hibernate中,如果在同一session中根据相同查询所得到的相同记录,则它们会有相同的内存地址。但是如果是不同的session中查询的相同记录,它们的内存地址就会不同。因此,使用“==”来比较两条记录是否代表数据库中的同一记录是不可行的。如果有必要比较通过查询后的内容是否相同,必须重写equals()与hashCode()方法。

例子如下:

public class User {
    private int id;
    private String username;
    private String password;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {

        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object otherObject) {
        // 判断内存地址是否相同
        if (this == otherObject) {
            return true;
        } else {
            // 判断是否为User对象
            if (!(otherObject instanceof User))
                return false;
        }
        User user = (User) otherObject;
        // 判断各个属性值是否相同
        if (id == user.id && username.equals(user.username) && password.equals(user.password) && age == user.age) {
            return true;
        }

        return false;
    }

    @Override
    public int hashCode() {
        int result;
        result = username.hashCode() + password.hashCode();
        result = 29 * age + result;
        return result;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_35224639/article/details/80396093