简单的说,这些集合类除了bag,都有其对应的JDK中接口的语义。它们都可以表示一对多或多对多。
Set对应于java.util.Set接口,表示一个没有重复元素的集合。
怎样区别重复元素?这就涉及到对象的同一性。我们知道在数据库中,我们用主键来区分每一条记录,在Java的对象世界中,我们是用Object.equals()方法来区分是否是等价的对象。
set保证,在这个集合中,没有重复的对象。即,没有任何对象之间用equals比较返回true。如果我们正确地覆盖了entity类中的equals方法,我们就能保证在set映射中,set没有重复对象。
bag没有对应语义的JDK接口,它对应的是java.util.Collection接口,它表示一个可以有重复元素的集合。
list对应JDK的java.util.List接口,可以有重复元素。
array对应对象数组,Hibernate也不建议使用。
除了上面的集合类,还有一个map映射,对应java.util.Map,当然语义上说就是值名对。
这些集合类都可用,主要看你以什么角度,怎样的使用方式来使用。区别就是上面所讲的。