当前位置: 代码迷 >> J2EE >> hibernate set list 差别
  详细解决方案

hibernate set list 差别

热度:2437   发布时间:2016-04-17 23:33:02.0
hibernate set list 区别
我的情况是这样的,有个,A对象,B对象
关系是,A 1-N B 对象
数据库中有
A:
ID
1
B:
ID AID
1  1
2  1
3  1

开始的时候我用LIST写的注解
private List<Organization> organizations = new ArrayList<Organization>();

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "REASON_ORGANIZATION_MAPPING", joinColumns = { @JoinColumn(name = "ReasonID") }, inverseJoinColumns = { @JoinColumn(name = "OrganizationID") })
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
public List<Organization> getOrganizations()
{
return organizations;
}

public void setOrganizations(List<Organization> organizations)
{
this.organizations = organizations;
}
然后我前台取得A对象ID=1,得到 A  和  B集合(三个B对象)
然后我删除了  B集合中的 两个 ,那就 只有 A 对象和 一个B 的 集合,传到后台,我直接遍历 A对象中的 B集合
还是有  三个B对象。。。。。。不知原因

最后 我把映射 改成了SET 类型
private Set<Organization> organizations = new HashSet<Organization>();

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "REASON_ORGANIZATION_MAPPING", joinColumns = { @JoinColumn(name = "ReasonID") }, inverseJoinColumns = { @JoinColumn(name = "OrganizationID") })
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
public Set<Organization> getOrganizations()
{
return organizations;
}

public void setOrganizations(Set<Organization> organizations)
{
this.organizations = organizations;
}
代码其他代码没有任何改变,我直接遍历 A对象中的 B集合只有一个对象了。。。这个是为什么
------解决思路----------------------
List里面可以放重复的值,Set里面是不能放重复的值的,而set判断对象是否重复是根据对象的equals方法来判断的,你可以重写Organization这个类的equals方法,用数据库的主键来判断相等。如果用eclipse的话直接右键,override,有个重写equals方法,选上主键的属性就行了。
------解决思路----------------------
简单来说!!List是可重复,但是是有序的,Set是不能重复,无序了。。如果 new  一个 TreeSet  那么  让就会变成有序的。。
  相关解决方案