在hibernate中 以Collection<Entity> 替换Map<Key, List<Value>结构
来源:互联网 发布:apache日志保留时间 编辑:程序博客网 时间:2024/06/07 22:35
最近一个老项目,模型结构是这样的
QualifiedEntity
mapping 文件
<class name="QualifiedRole">
.....
<map name="qualifiedEventRole" cascade="all"
table="VERIFIED_ROLES_MAP">
<key column="QUALIFIED_ROLE_ID" not-null="false" />
<map-key-many-to-many column="EVENT_ID" class="VerifiedEvent" />
<many-to-many column="ROLE_ID" class="Role" />
</map>
</class>
这样映射出来,会产生中间表,关联QualifiedRole主键及Role主键。并且QualifiedRole主键和VerifiedEvent的EVENT_ID作为联合主键。
现在需求变了,VerifiedEvent的id 可以关联多个role, 而不再是以前的1对1关系。所以看起来,应该对这样的模型进行映射
Map<VerifiedEvent, List<<Role>>, 不过查询了hibernate文档之后,不能直接对这样的结构进行映射。而采取把Map里面的 value:List<Role>放到一个新的wrapper类,再进行映射,如下:
<class name="QualifiedRole">
.....
<map name="qualifiedEventRole" cascade="all"
table="VERIFIED_ROLES_MAP">
<key column="QUALIFIED_ROLE_ID" not-null="false" />
<map-key-many-to-many column="EVENT_ID" class="VerifiedEvent" />
<many-to-many column="WRAPPER_ROLE_ID" class="WrapperRole" />
</map>
</class>
<class name="WrapperRole">
<id>**** </id>
<list>
<key column="WRAPPER_ROLE_ID" />
<list-index column="LIST_INDEX" />
<one-to-many class="Role" />
</list>
</class>
虽然这样能解决问题,但是在一个运行很久的系统来说,这样会造成数据表的变化,那么以前大量的老数据如何迁移?
基于以上考虑,决定使用一个新类: QualifiedEventRole,并利用它关联以前的Key和Value 对象,至于mapping,以映射Set的方式,即可重用以前的表结构。模型变化如下:
<class name="QualifiedRole">
.....
<set name="qualifiedEventRole" table="VERIFIED_ROLES_MAP"><key column="QUALIFIED_ROLE_ID" not-null="false" />
<composite-element class="VerifiedApplicationRole">
<many-to-one name="verificationEvent" class="VerifiedEvent" column="EVENT_ID"/>
<many-to-one name="role" class="Role" column="ROLE_ID"/>
</composite-element>
</set>
</class>
总结:以这种方式实现重构,表结构无任何变化,还是和以前一样,3张表:QualifiedRole, VerifiedEvent, Role以及一个中间表VERIFIED_ROLES_MAP,但以前的Key: VerifiedEvent对象,满足了需求,实现了对多个Role的依赖,不再有唯一约束。
在老数据很大,关系较负责的情况下,要考虑数据迁移的难度。能不变表结构实现重构,这样的方式,只需要修改domain模型相关代码,升级相对简单。
- 在hibernate中 以Collection<Entity> 替换Map<Key, List<Value>结构
- List 中Map集合key value应用
- 在map中根据value获取key
- 在map组成的List中发现修改一个map中的key-value,会影响導另一个
- jstl中取map,其中map的key是一个对象,value是一个list
- STL中map的key和value
- map中 key,value 对换 ,互换,
- map中 key,value 对换 ,互换
- 合并map中key相同的value
- Java中collection set list map
- C#中collection,list,map的使用
- java中collection、map、set、list简介
- Collection中List和Set、Map学习
- Android中(java)读取以key=value形式保存在txt等文本文件的数据
- Java map结构通过value来追踪key
- Struts2在页面中,取得Map的某一个key对应value值
- 在Java中自定义的一个key对多个Value的map
- Map存储 (key, value)
- C 语言字符数组的定义与初始化
- ArcGIS.Server.9.3和ArcGIS API for JavaScript中GraphicsLayer应用(五)
- POSIX 线程详解
- Linux-2.6.32.2内核在mini2440上的移植----激活RTC驱动
- KMP算法学习
- 在hibernate中 以Collection<Entity> 替换Map<Key, List<Value>结构
- virtualbox安装CentOS无法上网
- Predator:比微软Kinect更强的视频追踪算法-来自捷克博士论文
- oracle 数据库字符集 泰文入库问题
- Study notes for Decision Trees
- 80端口被封,apache架设代理服务器应急处理
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现Identify功能(六)
- SIP proxy server installation (repro from resiprocate)
- 利用 Openfiler 构建云端虚拟存储