JPA ManyToMany-即使值存在,也要始终在表中创建新值

时间:2019-03-23 18:38:32

标签: java mysql spring hibernate jpa

我要渡过一些麻烦。我在春季对网站的后端进行编码,并且正在使用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

我想在表标签中不要多余的内容。

可以帮我吗?

这是我的两节课的代码:

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

谢谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您的数据库中的标签表一定有问题。 创建表时,应在标签表中指定列名以具有唯一值。