在hibernate中 以Collection<Entity> 替换Map<Key, List<Value>结构

最近一个老项目,模型结构是这样的

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值