在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模型相关代码,升级相对简单。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 好钱包闪退怎么办 闲鱼认证失败怎么办 闲鱼买了假门票怎么办 买黄金买到假的怎么办 闲鱼被买家骗了怎么办 闲鱼上小视频没法保存怎么办 qq空间无法查看怎么办 华为手机电池不耐用怎么办 内内被动过怎么办 hp电脑开机黑屏怎么办 网上开店快递费怎么办 保温杯外壳掉漆怎么办 拖鞋前面磨脚怎么办 塑料拖鞋磨脚怎么办 路由器进不去设置界面怎么办 手机号丢了微信登不上怎么办 电脑总是闪黑屏怎么办 支付宝破产钱怎么办 淘宝号码注册过怎么办 农行k宝怎么办信用卡 电脑页面无法显示怎么办 对方银行停止收款怎么办 淘宝东西买太多怎么办 淘宝号黑号了怎么办… 中通包裹异常怎么办 包裹退回去了怎么办 qq支付密码错误怎么办 ie8出现闪退怎么办 平板输不了密码怎么办 华硕笔记本键盘打不开怎么办 电脑打不开rar文件怎么办 苹果手机淘宝卡怎么办 淘宝联盟网址打不开怎么办 淘宝买东西卖家不退货怎么办 手机清理后微信打不开视频怎么办 搜索历史已关闭怎么办 微博重新激活怎么办 淘宝直播反应慢怎么办 微信新设备无法登录怎么办 dnf自动连接失败怎么办 APP注册没有成功怎么办