Metoda equals i hashCode w encjach JPA

Odpowiedz Nowy wątek
tk
2018-05-01 17:53
tk

Rejestracja: 8 lat temu

Ostatnio: 1 dzień temu

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

Rejestracja: 3 lata temu

Ostatnio: 10 minut temu

Lokalizacja: U krasnoludów - pod górą

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)


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000, 2018-05-01 19:56

Pozostało 580 znaków

tk
2018-05-01 20:27
tk

Rejestracja: 8 lat temu

Ostatnio: 1 dzień temu

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

Rejestracja: 5 lat temu

Ostatnio: 2 minuty temu

Lokalizacja: Warszawa

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

Rejestracja: 2 lata temu

Ostatnio: 7 godzin temu

Lokalizacja: Wlk. Brytania

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

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