Hibernate unikalne wartości w bazie

0

Cześć, mam problem z hibernate. Mam encje User i Skill, relacja wiele do wielu. Baza to postgresql.
User:

@Entity
@Table(name = "user")
@Data
public class User extends StampedModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    private String description;

    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    @JoinTable(
            name="users_skills",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "skill_id")
    )
    private List<Skill> skills;

Skill:

@Entity
@Table(name = "skills")
@Data
public class Skill {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    @ManyToMany(mappedBy = "skills")
    List<User> users;

I chciałbym zrobić tak, że podczas dodawania nowego usera sprawdzam czy skill istnieje w bazie i jeśli istnieje to nie tworzę go kolejny raz tylko używam tego co już jest w bazie i przypisuje go do użytkownika a jeżeli nie ma takiego to chcę go utworzyć i przypisać do użytkownika.
Obecnie cały czas tworzą się nowe rekordy w bazie co powoduje duplikaty. Próbowałem poprzez unique ale leci wtedy wyjątek i złapać go to nie problem tylko jak go obsłużyć żeby robił to co wyżej napisałem?

0

A skąd hibernate ma wiedzieć co wg ciebie znaczy taki skill już istnieje? Aktualnie robi ci porównanie po ID i jak mu wyślesz skilla bez ustawionego ID to zrobi nowy wpis w bazie.

0

@Shalom: To jak to inaczej zrobić? Front wysyła w jsonie tylko pole name, można jakąś metodę napisać w repozytorium, żeby sprawdzała po polu name?

2

Z hibernate są problemy jeżeli chodzi o mapowanie używając list szczególnie w przypadku ManyToMany, lepiej użyć seta.

2

Tutaj @Column jest w ogóle niepotrzebne.

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