Spring JPA Postgresql - составные ключи дублируются, когда один из них не - PullRequest
0 голосов
/ 01 сентября 2018

У меня проблемы и надеюсь, что вы мне поможете, у меня есть следующая сущность:

Класс приложения:

@Entity
@Table(name = "apps")
public class App {
    @Id
    @Column(length = 15)
    private String name;

    @Column(length = 40)
    private String web;

    @Column(length = 50)
    private String mailDomain;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "app")
    private List<SocialNetwork> socialNetworks = new ArrayList<>();

//getters, setters, equals and hash

Класс социальной сети:

@Entity
@Table(name = "social_networks")
@IdClass(SocialNetworkCompositeKey.class)
public class SocialNetwork {
    @Id
    @Column(length = 15)
    private String name;

    @Id
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "app")
    private App app;

    @Column(nullable = false, length = 40)
    private String url;

//getters, setters, equals and hash

SocialNetworkCompositeKey Класс:

public class SocialNetworkCompositeKey implements Serializable {
    private String name;
    private String app;

//equals and hash

Теперь, когда я пытаюсь вставить приложение в свою программу или непосредственно в БД, я получаю исключение:

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "uk_590itpuvpqppd9f0g2w5y8bml"
  Detail: Key (app)=(Uli App) already exists.

Это при попытке вставить 2 записи с:

        app       name     url
----+---------+-----------+---------
  1 | Uli App | Twitter   | http...
----+---------+-----------+---------  
  2 | Uli App |  Linkedin | http...
----+---------+-----------+---------

Я использую последнюю версию Spring boot и JPA. Поэтому я использую JpaRepository для своих репозиториев. Даже если я попытаюсь ввести эти строки вручную в БД с помощью pgAdmin, это выдаст мне ту же ошибку.

Я не уверен, связано ли это, но я использую ddl-auto: update из спящего режима для автоматического создания таблиц.

Надеюсь, вы, ребята, можете мне помочь, ура.

1 Ответ

0 голосов
/ 03 сентября 2018

как сказал @Morteza, мои отношения были неправильными. С этим и другим уроком, который я обнаружил после того, как много копал (я действительно много гуглил перед тем, как опубликовать это), я смог исправить это, изменив отношение с @OneToMany на @ManyToOne в классе Social Networks. Это изменения, которые я сделал:

Класс приложения:

@OneToMany(mappedBy = "app", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<SocialNetwork> socialNetworks = new ArrayList<>();

Класс социальной сети:

@Id
@ManyToOne(fetch = FetchType.LAZY)
private App app;

Спасибо за помощь, ребята!

...