Quelle est la manière correcte de substituer hashCode () et equals () méthodes d'entité persistante?

J'ai une classe simple Rôle:

@Entity
@Table (name = "ROLE")
public class Role implements Serializable {

    @Id
    @GeneratedValue
    private Integer id;
    @Column
    private String roleName;

    public Role () { }

    public Role (String roleName) {
        this.roleName = roleName;
    }

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

    public Integer getId () {
        return id;
    }

    public void setRoleName (String roleName) {
        this.roleName = roleName;
    }

    public String getRoleName () {
        return roleName;
    }
}

Maintenant, je veux remplacer ses méthodes equals et hashCode. Ma première suggestion est:

public boolean equals (Object obj) {
    if (obj instanceof Role) {
        return ((Role)obj).getRoleName ().equals (roleName);
    }
    return false;
}

public int hashCode () {
    return id; 
}

Mais quand je créer un nouveau Rôle de l'objet, son id est null. C'est pourquoi j'ai un problème avec le hashCode de la méthode de la mise en œuvre. Maintenant, je peux tout simplement le retour roleName.hashCode () mais que faire si roleName n'est pas nécessaire de champ? Je suis presque sûr que ce n'est pas si difficile de faire plus compliqué exemple qui ne peut pas être résolu par le retour de hashCode de l'un de ses champs.

Donc j'aimerais voir quelques liens vers des discussions ou à entendre votre expérience de la résolution de ce problème. Merci!

source d'informationauteur Roman | 2009-12-18