【问题标题】:Hibernate: Transitive persistance of set of objects in an @ManyToMany relationshipHibernate:@ManyToMany 关系中对象集的传递持久性
【发布时间】:2009-01-27 19:47:39
【问题描述】:

我正在尝试映射以下内容:

public class Person{
  ...
  @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
  @JoinTable(name = "person_categories", joinColumns = @JoinColumn(name = "personId"), inverseJoinColumns = @JoinColumn(name = "categoryId"))
  private Set<Category> categories

  ...
}

public class Category {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "categoryId")
  private Integer id;

  @Column(unique = true)
  private Sting name

  ...
}

当我尝试保存 Person 对象时,会插入类别,但会将重复项存储到表中。如何确保每个类别在其表中都是唯一的,同时保持传递持久性?我已经尝试使 name 列唯一,但这只能通过抛出约束错误来帮助。

【问题讨论】:

  • 所以您是说在表 person_categories 中,您会发现多行具有完全相同的数据(对人员和类别的引用)?
  • 同一类别的多行被插入到类别表中。我希望 Category 表充当一个 Set,仅当记录不存在时才会在其中插入。

标签: java hibernate orm many-to-many


【解决方案1】:

如果您不重写 hashCode() 和 equals() 以使其对 Category 类有意义,那么您将在 Set 中获得重复项(如果您要添加重复项) .如果 name 字段是对象的区别,请尝试:

public int hashCode() {
    return name.hashCode();
}

public Object equals (Object o) {
    if (o instanceof Category) {
        return ((Category)o).name.equals(this.name);
    }
    return false;
}

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多