JPA ManyToMany — всегда создавать новое значение в таблице, даже если значение существует

Я переживаю некоторые неприятности. Весной я кодирую серверную часть веб-сайта и использую Rest API. Я создал два класса, которые являются отношением «ManyToMany». Первый класс — «StateOfArt», а второй — «Tag». Когда я запускаю сервер, я публикую 2 StateOfArt в Json (я использую Insomnia), и он работает довольно хорошо. Я имею в виду, что два StateOfArt находятся в моей БД. Проблема в том, что теги дублируются, даже если два объекта StateOfArt имеют одинаковые теги.

Вот пример: Я публикую два StateOfArt в Json, и это моя БД:

Мой стол StateOfArt

Мой стол Тег

Моя таблица присоединения

Я хотел бы иметь это в моей таблице соединений:

1 1

1 2

2 1

2 2

И я хотел бы, чтобы в теге таблицы не было избыточности.

Можно ли мне помочь?

Вот код моих двух классов:

@Entity(name = "StateOfArt")
public class StateOfArt {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;
    private String author;
    private String title;
    private String date;
    private ArrayList<String> co_author;
    private String theabstract;

    //@ManyToMany(fetch = FetchType.LAZY ,cascade = {CascadeType.ALL})
    @ManyToMany(fetch = FetchType.LAZY, cascade = {
            CascadeType.ALL
    })
    @JoinTable(name = "state_of_art_tag",
            joinColumns = @JoinColumn(name = "stateofart_id"),//, referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "tag_id"))//, referencedColumnName = "id"))
    //@JsonIgnore
    private Set<Tag> tags = new HashSet<>();

    public StateOfArt(){}

    public StateOfArt(Integer id, String author, String title, String date,ArrayList<String> co_author,String theabstract, HashSet<Tag> tags){
        super();
        this.id = id;
        this.title = title;
        this.author =author;
        this.date =date;
        this.co_author = co_author;
        this.theabstract = theabstract;
        //this.articles = articles;
        this.tags = tags;

    }



    //Getters and Setters are here
}

@Entity(name = "Tag")
@Table(name = "tag_for_stateofart")
public class Tag {

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

    @Column(length = 50)
    private String name;


    @ManyToMany(mappedBy = "tags")
    private Set<StateOfArt> stateofarts = new HashSet<>();

    public Tag() {}

    public Tag(String name) {
        this.name = name;
    }

    public String getTag() {
        return this.name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Tag tag = (Tag) o;
        return Objects.equals(name, tag.name);
    }
}

Спасибо за помощь.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
130
2

Ответы 2

Это должно быть проблема с таблицей тегов в вашей базе данных. Когда вы создаете таблицу, вы должны указать имя столбца в таблице тегов, чтобы иметь уникальные значения.

когда я помещал @NaturalID в начало имени, я получил эту ошибку при попытке опубликовать второй StateOfArt: java.sql.SQLIntegrityConstraintViolationException: повторяющаяся запись «Машинное обучение» для ключа «UK_t64dms8c1we9nmkfs5nub029r»

max5336 23.03.2019 22:19

Вероятно, вы снова создаете тот же тег. Проверьте, существует ли тег с таким именем в БД, если да, загрузите его из таблицы тегов.

Как я мог это сделать, зная, что я использую JSON для ввода новых данных?

max5336 24.03.2019 08:56

Проверить, существует ли тег с таким именем в БД, если нет, то он новый

Peter Šály 24.03.2019 09:36

хорошо, но как мне это сделать, когда я использую Json для ввода новых данных?

max5336 24.03.2019 16:21

Другие вопросы по теме