Java 如何使用JPA和Hibernate在多对多关系中使用唯一字段保存数据

Java 如何使用JPA和Hibernate在多对多关系中使用唯一字段保存数据,java,hibernate,many-to-many,Java,Hibernate,Many To Many,我刚进入hibernate,我有下一个情况: @Entity class Post { @Id id; @ManyToMany @JoinTable(name = "ATag", joinColumns = @JoinColumn(name = "post_id"), inverseJoinColumns = @JoinColumn(name = "tag_id")) Set<Tag> tags; } @Entity class

我刚进入hibernate,我有下一个情况:

@Entity 
class Post {
    @Id id;

    @ManyToMany
    @JoinTable(name = "ATag", joinColumns = @JoinColumn(name = "post_id"),
        inverseJoinColumns = @JoinColumn(name = "tag_id"))
    Set<Tag> tags;
}

@Entity 
class Tag {
    @Id Long id;
    String name;
}

我如何处理这种情况?

由于您试图保存的记录已经存在,您需要调用更新保存或更新。。。但这取决于你为什么要保存一个重复的记录?您正在尝试插入或只是更新现有记录吗?

您需要在
标记
类中添加实现。使用
name
属性来区分不同的标记是一个好主意

由于
Post
tags
是一个
集合
,因此它将在刷新集合之前丢弃重复项,因此您不应该得到约束冲突

@Entity 
public class Tag {

    @Id Long id;
    String name;

    @Override
    public int hashCode() {
        HashCodeBuilder hcb = new HashCodeBuilder();
        hcb.append(name);
        return hcb.toHashCode();
    }

    @Override
    public boolean equals(Object obj) {
       if (this == obj) {
            return true;
        }
        if (!(obj instanceof Tag)) {
            return false;
        }
        Tag that = (Tag) obj;
        EqualsBuilder eb = new EqualsBuilder();
        eb.append(name, that.name);
        return eb.isEquals();
    }
}

我想你的建议不会解决我的问题,因为我不需要同名的标记。根据equals/hadhCode设置过滤器重复项,以便只有有效数据到达Db。我只想保存可以有多个标记的帖子。如果我用新标签保存新文章,它将保存它,但是如果我用已经存在的标签保存新文章,它将导致错误。
@Entity 
public class Tag {

    @Id Long id;
    String name;

    @Override
    public int hashCode() {
        HashCodeBuilder hcb = new HashCodeBuilder();
        hcb.append(name);
        return hcb.toHashCode();
    }

    @Override
    public boolean equals(Object obj) {
       if (this == obj) {
            return true;
        }
        if (!(obj instanceof Tag)) {
            return false;
        }
        Tag that = (Tag) obj;
        EqualsBuilder eb = new EqualsBuilder();
        eb.append(name, that.name);
        return eb.isEquals();
    }
}