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学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable
如何在Java-EE中使用hibernate实现ManyToMany关系?