ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 19.5.1\. 分类(Taxonomy) Hibernate定义了三种基本类型的集合: * 值数据集合 * 一对多关联 * 多对多关联 这个分类是区分了不同的表和外键关系类型,但是它没有告诉我们关系模型的所有内容。 要完全理解他们的关系结构和性能特点,我们必须同时考虑“用于Hibernate更新或删除集合行数据的主键的结构”。 因此得到了如下的分类: * 有序集合类 * 集合(sets) * 包(bags) 所有的有序集合类(maps, lists, arrays)都拥有一个由`<key>`和 `<index>`组成的主键。 这种情况下集合类的更新是非常高效的——主键已经被有效的索引,因此当Hibernate试图更新或删除一行时,可以迅速找到该行数据。 集合(sets)的主键由`<key>`和其他元素字段构成。 对于有些元素类型来说,这很低效,特别是组合元素或者大文本、大二进制字段; 数据库可能无法有效的对复杂的主键进行索引。 另一方面,对于一对多、多对多关联,特别是合成的标识符来说,集合也可以达到同样的高效性能。( 附注:如果你希望`SchemaExport`为你的`<set>`创建主键, 你必须把所有的字段都声明为`not-null="true"`。) `<idbag>`映射定义了代理键,因此它总是可以很高效的被更新。事实上, `<idbag>`拥有着最好的性能表现。 Bag是最差的。因为bag允许重复的元素值,也没有索引字段,因此不可能定义主键。 Hibernate无法判断出重复的行。当这种集合被更改时,Hibernate将会先完整地移除 (通过一个(in a single `DELETE`))整个集合,然后再重新创建整个集合。 因此Bag是非常低效的。 请注意:对于一对多关联来说,“主键”很可能并不是数据库表的物理主键。 但就算在此情况下,上面的分类仍然是有用的。(它仍然反映了Hibernate在集合的各数据行中是如何进行“定位”的。)