hibernate多态union-subclass

这里写自定义目录标题

背景

项目的需求是这样的:目前有一主业绩单信息和合同信息的关系是一对一,但现在在针对合同进行返佣金时,会产生多条业绩数据,我们叫它佣金业绩单,返佣时会多次返,佣金业绩单除了钱和主业绩单不同外,其它字段信息完全一样。

现状

现有一主业绩单po:leasePerformance.java,leasePerformance.hbm.xml
里面各种属性省略,
配置我只给关键,如:

在这里插入图片描述

目标

在不修改原有业务及代码的前提下,对此次需求进行迭代。
我只给出我最终的解决方案,其过程的各种尝试就不多说了。
启发来源于:https://www.cnblogs.com/smarterplanet/p/4204641.html
感谢此作者。

实现方案

由于返佣业绩和合同的有关系是多对一的,所以不能对原有业绩进行处理(其实也可以,加字段区分,但这样做得不偿失,原有业务及代码改动太多,风险太大,估pass),即无感处理。所以我们新建一张表和主业绩的字段一样,然后扩展佣金需要的字段,字段:主业绩单表字段+佣金类型+主业绩单的id。代码如下:

主业绩表:
create table Lease_Performance
(
id char(32),
version number(3),
contId char(32)
address varchar2(500)

)
佣金业绩单:

create table Lease_Brokerage_Performance
(
id char(32),
version number(3),
contId char(32)
address varchar2(500)

BrokerageType number(2),
perfId char(32)

)

原有是一个正常的po LeasePerformance ,现我们需要把在原有po的基础上抽象出一层LeasePerformanceParent,并abstract ,把LeasePerformance 原有属性全放在LeasePerformanceParent里,

LeasePerformance extents LeasePerformanceParent即可。

另外,还需要新建LeasePerformanceParent.hbm.xml文件,但不映射数据库表,配置关键如下 :
在这里插入图片描述

这样LeasePerformance的hbm配置文件修改为:
在这里插入图片描述

最后,新建佣金业绩po
LeaseBrokeragePerformance extend LeasePerformance{
BrokerageType ,
perfId ,
}

配置文件如:

在这里插入图片描述

这样原有业务不用处理,新的业务正常扩展。

总结

知识点:利用union-class的特点,查询时子类只查子类,父类不映射数据库。
若我们直接继承原有leaseperformance,再在LeaseBrokeragePerformance里用union-subclass,后果很严重啊,原有的查询直接生成的hql给你union all ,父类子类的数据都给查出来,显然这不我们想要的结果。其间这样也试过,什么配置polymorphism,lazy啥的,毛用没有。

这方案可能只适合我目前的这种场景,欢迎斧正讨论。