我要解决一些麻烦。我在春季对网站的后端进行编码,并且正在使用Rest API。
我创建了两个类,它们之间的关系为“ ManyToMany”。
第一类是“ StateOfArt”,第二类是“ Tag”。
当我启动服务器时,我在Json中发布了2个StateOfArt(我正在使用Insomnia),并且运行良好。我的意思是这两个StateOfArt在我的数据库中。问题是,即使两个StateOfArt具有相同的标签,标签也会重复。

这是一个例子:
我在Json中发布了两个StateOfArt,这是数据库:

My table StateOfArt

My table Tag

My Join table

我想在我的联接表中有这个:

1 1

1 2

2 1

2 2

而且我不想在table标记中有冗余。

有什么可以帮助我的吗?

这是我的两个类的代码:

@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);
    }
}


谢谢您的帮助。

最佳答案

可能您是在重新创建相同的标签。检查数据库中是否存在具有该名称的标签,如果是,则从“标签”表中加载它。

09-26 08:42