继承在开发中的使用

前段时间,红帽公司的高级架构师来公司培训了hibernate的高级应用,因为本人是做前台转到做后台的,所有好多东西是云里雾里的。当时老师讲到领域模型设计以及hibernate的继承的使用,刚开始并没理解对象继承的作用,感觉继承也减少不了多少工作量。而且hibernate的延迟加载还不支持 向下转型 和instanceof 以为这东西在我实际开发中使用价值不大。但最近的一个项目,我试着使用领域模型进行设计并且在实施中发现了许多好处。
任务计划需求:任务计划分个人任务:也就是私人任务;定期性任务:就是固定时间要做的一些任务,比如上传报表之类的任务.;工作任务:就是上级指派给下级需要完成的任务。
这三种任务在不同的界面进行增加,但需要在一个界面进行展示,也就是现在业界比较流行的日视图,周视图,月视图之类的。这种情况采用继承就比较方便
任务计划的对象xml为

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.going.oa.model">
<class name="Task" abstract="true">
<id access="field" name="id" type="string" column="TASK_ID" length="32">
<generator class="uuid"/>
</id>


<property name="updateBy" type="string">
<column name="UPDATE_BY" length="15">
<comment>修改人工号</comment>
</column>
</property>

<property name="updateTime" type="string">
<column name="UPDATE_TIME" length="14">
<comment>修改时间</comment>
</column>
</property>

<property name="archiveFlag" type="string">
<column name="ARCHIVE_FLAG" length="5">
<comment>归档标志</comment>
</column>
</property>

<property name="accreditRoleName" type="text">
<column name="ACCREDIT_ROLE_NAME" length="4000">
<comment>授权角色名称</comment>
</column>
</property>

<property name="accreditRoleId" type="text">
<column name="ACCREDIT_ROLE_ID" length="4000">
<comment>授权角色id串</comment>
</column>
</property>

<property name="accreditOrgId" type="text">
<column name="ACCREDIT_ORG_ID" length="4000">
<comment>授权机构id串</comment>
</column>
</property>

<property name="accreditOrgName" type="text">
<column name="ACCREDIT_ORG_NAME" length="4000">
<comment>授权机构名称</comment>
</column>
</property>

<property name="accreditUserId" type="text">
<column name="ACCREDIT_USER_ID" length="4000">
<comment>授权人id串</comment>
</column>
</property>

<property name="accreditUserName" type="text">
<column name="ACCREDIT_USER_NAME" length="4000">
<comment>授权人姓名</comment>
</column>
</property>

<property name="startTime" type="string">
<column name="START_TIME" length="20">
<comment>开始时间</comment>
</column>
</property>

<property name="endTime" type="string">
<column name="END_TIME" length="20">
<comment>结束时间</comment>
</column>
</property>

<property name="taskType" type="string">
<column name="TASK_TYPE" length="4000">
<comment>任务类型</comment>
</column>
</property>

<property name="awokeTime" type="string">
<column name="AWOKE_TIME" length="4000">
<comment>提醒时间</comment>
</column>
</property>

<property name="content" type="string">
<column name="TASK_CONTENT" length="4000">
<comment>任务内容</comment>
</column>
</property>

<property name="title" type="string">
<column name="TASK_TITLE" length="4000">
<comment>主题</comment>
</column>
</property>

<property name="taskState" type="string">
<column name="TASK_STATE" length="4000">
<comment>任务状态</comment>
</column>
</property>

<property name="innerNote" type="string">
<column name="INNER_NOTE" length="4000">
<comment>内部短信</comment>
</column>
</property>


<property name="issuanceName" type="string">
<column name="ISSUANCE_NAME" length="50">
<comment>发布人姓名</comment>
</column>
</property>
<property name="issuanceId" type="string">
<column name="ISSUANCE_ID" length="15">
<comment>发布人工号</comment>
</column>
</property>

<union-subclass name="IndividualTask" table="OA_INDIVIDUAL_TASK">

</union-subclass>

<union-subclass name="PeriodTask" table="OA_PERIOD_TASK">
</union-subclass>

<union-subclass name="WorkTask" table="OA_WORK_TASK">
<set name="attachments" table="ATTACHMENT_INFO" order-by="ISSUANCE_DATE">
<key column="ATTACHEMENT_ID"/>
<one-to-many class="Attachment"/>
</set>
</union-subclass>
</class>
</hibernate-mapping>

采用union-subclass模式,该模式为每个子类生成一个对应的数据库表。
因为在统一界面展示,如果采用以前的设计方式 ,在进行CRUD时如果从前台传入一个id ,后台可能不知道是属于哪个类的对象,只能由程序员写原生sql或者遍历去找该对象后再操作,而现在使用继承方式的话,这些工作hibernate就会帮我们自己完成。比如get对象通过id。

select
task0_.TASK_ID as TASK1_21_0_,
task0_.UPDATE_BY as UPDATE2_21_0_,
task0_.UPDATE_TIME as UPDATE3_21_0_,
task0_.ARCHIVE_FLAG as ARCHIVE4_21_0_,
task0_.ACCREDIT_ROLE_NAME as ACCREDIT5_21_0_,
task0_.ACCREDIT_ROLE_ID as ACCREDIT6_21_0_,
task0_.ACCREDIT_ORG_ID as ACCREDIT7_21_0_,
task0_.ACCREDIT_ORG_NAME as ACCREDIT8_21_0_,
task0_.ACCREDIT_USER_ID as ACCREDIT9_21_0_,
task0_.ACCREDIT_USER_NAME as ACCREDIT10_21_0_,
task0_.START_TIME as START11_21_0_,
task0_.END_TIME as END12_21_0_,
task0_.TASK_TYPE as TASK13_21_0_,
task0_.AWOKE_TIME as AWOKE14_21_0_,
task0_.TASK_CONTENT as TASK15_21_0_,
task0_.TASK_TITLE as TASK16_21_0_,
task0_.TASK_STATE as TASK17_21_0_,
task0_.INNER_NOTE as INNER18_21_0_,
task0_.ISSUANCE_NAME as ISSUANCE19_21_0_,
task0_.ISSUANCE_ID as ISSUANCE20_21_0_,
task0_.clazz_ as clazz_0_
from
( select
ACCREDIT_ROLE_NAME,
INNER_NOTE,
TASK_CONTENT,
ACCREDIT_ORG_NAME,
AWOKE_TIME,
TASK_ID,
TASK_TYPE,
ACCREDIT_ROLE_ID,
ACCREDIT_USER_NAME,
UPDATE_BY,
TASK_STATE,
UPDATE_TIME,
END_TIME,
ACCREDIT_ORG_ID,
ISSUANCE_ID,
TASK_TITLE,
START_TIME,
ISSUANCE_NAME,
ARCHIVE_FLAG,
ACCREDIT_USER_ID,
1 as clazz_
from
OA_INDIVIDUAL_TASK
union
select
ACCREDIT_ROLE_NAME,
INNER_NOTE,
TASK_CONTENT,
ACCREDIT_ORG_NAME,
AWOKE_TIME,
TASK_ID,
TASK_TYPE,
ACCREDIT_ROLE_ID,
ACCREDIT_USER_NAME,
UPDATE_BY,
TASK_STATE,
UPDATE_TIME,
END_TIME,
ACCREDIT_ORG_ID,
ISSUANCE_ID,
TASK_TITLE,
START_TIME,
ISSUANCE_NAME,
ARCHIVE_FLAG,
ACCREDIT_USER_ID,
2 as clazz_
from
OA_PERIOD_TASK
union
select
ACCREDIT_ROLE_NAME,
INNER_NOTE,
TASK_CONTENT,
ACCREDIT_ORG_NAME,
AWOKE_TIME,
TASK_ID,
TASK_TYPE,
ACCREDIT_ROLE_ID,
ACCREDIT_USER_NAME,
UPDATE_BY,
TASK_STATE,
UPDATE_TIME,
END_TIME,
ACCREDIT_ORG_ID,
ISSUANCE_ID,
TASK_TITLE,
START_TIME,
ISSUANCE_NAME,
ARCHIVE_FLAG,
ACCREDIT_USER_ID,
3 as clazz_
from
OA_WORK_TASK
) task0_
where
task0_.TASK_ID=?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值