我的Java bean与我有很多关系。当我使用如下List方式定义变量时:
List
@Entity @Table(name="ScD") public class Group extends Nameable { @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER) @JoinColumn(name="b_fk") private List<R> r; //or private Set<R> r;
我得到那个错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' ...
当我使用时,Set一切似乎都运行良好。
Set
我想问的是,在使用多对多关系时,哪一个关系用于逻辑概念List或Set(因为列表可能有重复项和集合,但是性能和其他问题又如何)?
从关系数据库的角度来看,这是一个集合。数据库不会保留顺序,并且使用a List是没有意义的,它们的顺序是不确定的(除非使用所谓的 索引集合 )。
使用a Set也具有很大的性能影响。List使用Hibernate 时,PersistentBag在下面使用具有某些可怕特征的集合。即:如果您添加新关系,它将首先删除所有现有关系,然后再将其重新插入并添加新关系。使用Set它仅插入新记录。
PersistentBag
第三件事- List在一个实体中不能有多个,因为您将声名狼藉 ,无法同时获取多个bag 异常。
也可以看看:
19.5。了解馆藏表现
为什么Hibernate会“先删除所有内容然后重新插入”-并不奇怪