千家信息网

Hibernate高级集合映射是什么

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,本篇内容主要讲解"Hibernate高级集合映射是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hibernate高级集合映射是什么"吧!Hibern
千家信息网最后更新 2025年01月21日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安全错误 数据库的锁怎样保障安全 数据库技术双语教材 管家婆登陆服务器出错 闵行区市场软件开发销售价格 杨浦区参考数据库销售品质保障 广东人网络技术 浙江服务器管理机房it维保 巫师之怒俄罗斯服务器 网络技术专业适合哪些城市 提升网络安全主动防御能力 电话显示服务器错误请稍后再试 网络安全素质教育考题 软件开发 邀请链接 智慧水务网络安全问题 江苏c语言软件开发哪家专业 解放碑服务器是烟花区 梦幻西游哪个服务器好2022年 最大的临床对照实验数据库是什么 软件开发商会什么 如何异地连接公司数据库 网站出现服务器安全狗 跟北大博士学习网络技术 苏州阿里云数据库变更 学校网络安全宣传周工作方案 域服务器管理角色 魔力单机6.0提示服务器列表 云服务器挂机赚钱 中兴通讯波分软件开发 服务器端口开放过多影响安全 数据库基础知识第一张答案 navicat做数据库维护
0