Java 如何使用JPA和Hibernate在多对多关系中使用唯一字段保存数据
我刚进入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
@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();
}
}