千家信息网

Hibernate高级集合映射是什么

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"Hibernate高级集合映射是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hibernate高级集合映射是什么"吧!Hibern
千家信息网最后更新 2026年11月03日Hibernate高级集合映射是什么

本篇内容主要讲解"Hibernate高级集合映射是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hibernate高级集合映射是什么"吧!

Hibernate高级集合映射主要分为有序集合、双向关联、双向关联,涉及有序集合类、 三重关联(Ternary associations)、使用。
1. 有序集合(Sorted collections)

Hibernate高级集合映射支持实现java.util.SortedMap和java.util.SortedSet的集合。你必须在映射文件中指定一个比较器:

                             

sort属性中允许的值包括unsorted,natural和某个实现了java.util.Comparator的类的名称。

分类集合的行为事实上象java.util.TreeSet或者java.util.TreeMap。

如果你希望数据库自己对集合元素排序,可以利用set,bag或者map映射中的order-by属性。这个解决方案只能在jdk1.4或者更高的jdk版本中才可以实现(通过LinkedHashSet或者 LinkedHashMap实现)。 它是在SQL查询中完成排序,而不是在内存中。

                             

注意: 这个order-by属性的值是一个SQL排序子句而不是HQL的!

关联还可以在运行时使用集合filter()根据任意的条件来排序。

ssortedUsers = s.createFilter( group.getUsers(), "order by this.name" ).list();

2. 双向关联(Bidirectional associations)

双向关联允许通过关联的任一端访问另外一端。在Hibernate中, 支持两种类型的双向关联:

◆一对多(one-to-many)
Set或者bag值在一端, 单独值(非集合)在另外一端

◆多对多(many-to-many)
两端都是set或bag值


要建立一个双向的多对多关联,只需要映射两个many-to-many关联到同一个数据库表中,并再定义其中的一端为inverse(使用哪一端要根据你的选择,但它不能是一个索引集合)。

这里有一个many-to-many的双向关联的例子;每一个category都可以有很多items,每一个items可以属于很多categories:

          ...                                          ...                                    

如果只对关联的反向端进行了改变,这个改变不会被持久化。 这表示Hibernate为每个双向关联在内存中存在两次表现,一个从A连接到B,另一个从B连接到A。如果你回想一下Java对象模型,我们是如何在Java中创建多对多关系的,这可以让你更容易理解:

category.getItems().add(item);          // The category now "knows" about the relationship  item.getCategories().add(category);     // The item now "knows" about the relationship   session.persist(item);                   // The relationship won''t be saved!  session.persist(category);               // The relationship will be saved

非反向端用于把内存中的表示保存到数据库中。

要建立一个一对多的双向关联,你可以通过把一个一对多关联,作为一个多对一关联映射到到同一张表的字段上,并且在"多"的那一端定义inverse="true"。

          ....                                          ....       

在"一"这一端定义inverse="true"不会影响级联操作,二者是正交的概念!

3. 双向关联,涉及有序集合类

对于有一端是或者的双向关联,需要加以特别考虑。假若子类中的一个属性映射到索引字段,没问题,我们仍然可以在集合类映射上使用inverse="true":

          ....                                                   ....            

但是,假若子类中没有这样的属性存在,我们不能认为这个关联是真正的双向关联(信息不对称,在关联的一端有一些另外一端没有的信息)。在这种情况下,我们不能使用inverse="true"。我们需要这样用:

          ....                                                   ....       

注意在这个映射中,关联中集合类"值"一端负责来更新外键.TODO: Does this really result in some unnecessary update statements?

4. 三重关联(Ternary associations)

有三种可能的途径来映射一个三重关联。***种是使用一个Map,把一个关联作为其索引:

                                 

第二种方法是简单的把关联重新建模为一个实体类。这使我们最经常使用的方法。

***一种选择是使用复合元素,我们会在后面讨论

5. 使用

如果你完全信奉我们对于"联合主键(composite keys)是个坏东西",和"实体应该使用(无机的)自己生成的代用标识符(surrogate keys)"的观点,也许你会感到有一些奇怪,我们目前为止展示的多对多关联和值集合都是映射成为带有联合主键的表的!现在,这一点非常值得争辩;看上去一个单纯的关联表并不能从代用标识符中获得什么好处(虽然使用组合值的集合可能会获得一点好处)。不过,Hibernate提供了一个(一点点试验性质的)功能,让你把多对多关联和值集合应得到一个使用代用标识符的表去。

属性让你使用bag语义来映射一个List (或Collection)。

                              

你可以理解,人工的id生成器,就好像是实体类一样!集合的每一行都有一个不同的人造关键字。但是,Hibernate没有提供任何机制来让你取得某个特定行的人造关键字。

注意的更新性能要比普通的高得多!Hibernate可以有效的定位到不同的行,分别进行更新或删除工作,就如同处理一个list, map或者set一样。

在目前的实现中,还不支持使用identity标识符生成器策略来生成集合的标识符。

到此,相信大家对"Hibernate高级集合映射是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

关联 双向 一端 属性 高级 标识 标识符 有序 排序 生成 内存 实体 数据 数据库 方法 索引 代用 支持 更新 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 美国互联网保险保险科技 华宇互联网科技 期待互联网科技 致骋互联网科技 互联网科技小额贷款 猫创互联网科技 北京华百购互联网科技有限公司 茂名市互联网科技产业园 燊美集互联网科技有限公司 乌鲁木齐新华智原互联网科技学校 深圳市罗太互联网科技有限公司 互联网科技创新的路径 元气玛特互联网科技公司是外包吗 伍佰万互联网科技怎么赚钱 银行科技岗属于互联网吗 张召忠谈中国互联网科技 抖集互联网科技技术咨询 银川新华互联网科技学校是国营吗 绵阳真晨互联网科技有限公司 山东亿川互联网科技有限责任公司 科技金融是不是互联网金融 盈实互联网科技 互联网金融 金融科技 奇酷互联网络科技 百单互联网科技有限公司 互联网公司科技股 天津腾达互联网科技有限公司 山东有哪些互联网科技公司 杭州披云加互联网科技有限公司 美国互联网科技公司
0