Metoda equals i hashCode w encjach JPA

Odpowiedz Nowy wątek
2018-05-01 17:53
tk
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?

edytowany 1x, ostatnio: tk, 2018-05-01 18:05

Pozostało 580 znaków

2018-05-01 19:53
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-[...]tring-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)


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 3x, ostatnio: jarekr000000, 2018-05-01 19:56

Pozostało 580 znaków

2018-05-01 20:27
tk
0

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

Dokładnie - nie zauważyłem tego unique = true, a nawet szukałem :-) - jarekr000000 2018-05-02 00:08

Pozostało 580 znaków

2018-05-01 21:01

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


Nie pomagam przez PM. Pytania zadaje się na forum.
edytowany 2x, ostatnio: scibi92, 2018-05-01 21:40
Dzieki, wyglada ciekawie :) - tk 2018-05-01 21:15

Pozostało 580 znaków

2018-05-02 21:11
0

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

Z całym szacunkiem ale przy JPA/Hibernate to nie jest najlepszy pomysł - wartek01 2018-05-02 21:29
Dlaczego? Jestem początkujący dlatego pytam :) - discoStar 2018-05-02 23:04
najbardziej by kusił klucz pierwotny ... tyle że pewien czas nie istnieje i kupa (patrz w/w YT) - AnyKtokolwiek 2018-08-13 20:40

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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