Hibernate: транзитивное постоянство набора объектов в отношении @ManyToMany - PullRequest
0 голосов
/ 27 января 2009

Я пытаюсь отобразить следующее:

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, категории вставляются, но дубликаты сохраняются в таблице. Как я могу гарантировать, что каждая категория уникальна в своей таблице и при этом поддерживает транзитивное постоянство? Я попытался сделать столбец имени уникальным, но это помогло только путем выдачи ошибок ограничения.

1 Ответ

1 голос
/ 28 января 2009

Если вы не переопределяете значения hashCode () и equals (), чтобы иметь значение для класса Category , то вы получите дубликаты в своем наборе (если вы сначала добавляете дубликаты). Если поле 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;
}
...