Hibernate:@ManyToMany 关系中对象集的传递持久性

Posted

技术标签:

【中文标题】Hibernate:@ManyToMany 关系中对象集的传递持久性【英文标题】:Hibernate: Transitive persistance of set of objects in an @ManyToMany relationship 【发布时间】: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,仅当记录不存在时才会在其中插入。 【参考方案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;

【讨论】:

以上是关于Hibernate:@ManyToMany 关系中对象集的传递持久性的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:ManyToMany 反向删除

码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable

Hibernate - 从多对多关系访问字段

如何在Java-EE中使用hibernate实现ManyToMany关系?

如何从 @ManyToMany 关系中删除与 JPA 和 Hibernate 中的许多子对象的子对象

使用JPA和Hibernate提供程序的ManyToMany关系不会创建主键