Metoda equals i hashCode w encjach JPA

0

Powiedzmy, ze mam nastepujace encje:

@Entity
public class ArticleCategoryEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @NotBlank
    @Size(min = 1, max = 80)
    @Column(unique = true)
    private String name; // Pole unikalne

    @Size(min = 1, max = 256)
    private String description;

    @OneToMany(mappedBy = "category")
    private Set<ArticleEntity> articles = new HashSet<>();
}
@Entity
public class ArticleEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @NotBlank
    @Size(min = 1, max = 4096)
    private String text;

    @NotNull
    private LocalDate published;

    @ManyToOne
    private ArticleCategoryEntity category;

    @OneToMany(mappedBy = "article")
    private Set<CommentEntity> comments = new HashSet<>();
}
@Entity
public class CommentEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @NotBlank
    @Size(min = 1, max = 512)
    private String text;

    @NotNull
    private LocalDate date;

    @ManyToOne
    private ArticleEntity article;
}

Jak waszym zdaniem powinny wygladac metody equals i hashCode dla powyższych przypadkow?

2

W tym przypadku hashCode i equals korzystający z klucza sztucznego będzie chyba najlepszy, choć ogólnie dla JPA/Hibernate często (zawsze?) nie da się zrobić dobrego equals/hashCode. Po prostu wybierasz na czym Ci się ma wywalić :-)

hashCode - korzystający z klucza sztucznego będzie miał dziwne efekty przy persist i zapisywaniu nowych elementów. Ale przy typowo zbudowanej aplikacji (nie trzymasz długo referencji do entity) - nie zobaczysz problemu.

https://vladmihalcea.com/the-best-way-to-implement-equals-hashcode-and-tostring-with-jpa-and-hibernate/
(Tam jest zabawnie podany hashCode, który choć wygląda dziwnie... to gwarantuje, że nie wywali Ci się nawet jeśli troche dłużej niż zwykle trzymasz te referencje do entity)

0

Dobrze, a nie sadzisz, ze lepszym pomyslem w ArticleCategoryEntity byloby wykorzystanie pola "name" skoro jest unikalne?

1

Tutaj jest ciekawe podejście (ustawiłem taki czas że jak włączysz to na odpowiedni moment trafisz ;) ) :

0

Ja używam equals() i hashcode() automatycznie generowanego przez IntelliJ (Alt + Insert)

1 użytkowników online, w tym zalogowanych: 0, gości: 1