Я переживаю некоторые неприятности. Весной я кодирую серверную часть веб-сайта и использую Rest API. Я создал два класса, которые являются отношением «ManyToMany». Первый класс — «StateOfArt», а второй — «Tag». Когда я запускаю сервер, я публикую 2 StateOfArt в Json (я использую Insomnia), и он работает довольно хорошо. Я имею в виду, что два StateOfArt находятся в моей БД. Проблема в том, что теги дублируются, даже если два объекта StateOfArt имеют одинаковые теги.
Вот пример: Я публикую два StateOfArt в Json, и это моя БД:
Я хотел бы иметь это в моей таблице соединений:
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);
}
}
Спасибо за помощь.




Это должно быть проблема с таблицей тегов в вашей базе данных. Когда вы создаете таблицу, вы должны указать имя столбца в таблице тегов, чтобы иметь уникальные значения.
Вероятно, вы снова создаете тот же тег. Проверьте, существует ли тег с таким именем в БД, если да, загрузите его из таблицы тегов.
Как я мог это сделать, зная, что я использую JSON для ввода новых данных?
Проверить, существует ли тег с таким именем в БД, если нет, то он новый
хорошо, но как мне это сделать, когда я использую Json для ввода новых данных?
когда я помещал @NaturalID в начало имени, я получил эту ошибку при попытке опубликовать второй StateOfArt: java.sql.SQLIntegrityConstraintViolationException: повторяющаяся запись «Машинное обучение» для ключа «UK_t64dms8c1we9nmkfs5nub029r»