继承映射

mybatis实现继承映射 类图 有一个机动车父类,它有两个子类:Car和Bus   关系模型(t_vehicle) ORM映射有一个原则:对象模型细粒度,关系模型粗粒度。所以我们将所有的车都存储一张表里(t_vehicle),通过鉴别字段vType来区分车的类型("c"代表Car,"b"代表Bus) 三个类的代码 Vehicle package com.tgb.mybatis. 阅读详情

一、

Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade:

       none,all,save-update ,delete, lock,refresh,evict,replicate,persist,

  merge,delete-orphan(one-to-many) 。

一般对many-to-one,many-to-many不设置级联,在<one-to-one>和<one-to-many>中设置级联。

 

 

二、inservse

inverse表“是否放弃维护关联关系”(在Java里两个对象产生关联时,对数据库表的影响),在one-to-many和many-to-many的集合定义中使用,inverse=”true”表示该对象不维护关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。

       one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。

       注: 配置成one-to-one的对象不维护关联关系。inservse是集合的属性,但不适用在list集合中,因为这样list的顺序会失效。

 

例如:一对多中,在one这方放弃维护关联关系:

<map name="emps" inverse="true">

    <key column="depart_id"/>

    <map-key type="long" column="name"/>

    <one-to-many class="Employee"/>

</map>

放弃前:

Hibernate: insert into Department (name) values (?)

Hibernate: insert into Employee (name, depart_id) values (?, ?)

Hibernate: insert into Employee (name, depart_id) values (?, ?)

Hibernate: update Employee set depart_id=?, name=? where id=?

Hibernate: update Employee set depart_id=?, name=? where id=?

放弃后:

Hibernate: insert into Department (name) values (?)

Hibernate: insert into Employee (name, depart_id) values (?, ?)

Hibernate: insert into Employee (name, depart_id) values (?, ?)

 

三、继承映射:

优点:方便。

缺点:但是每增加一个子类,就会改变表employee的结构,还有大量的null值。

方式一:一个类继承体系一张表

整个的集成体系用一张表,设计一张表employee:

type字段是一个由hibrnate自动生成的鉴别器,用来区分员工类型的。

       Id   name   depart_id   type    skill        sell

                                0      null         null    普通员工

                                1      coding       null    销售员

                                2      null         100      技术员

   

1、分别编写Skiller类和sell类,均继承employee类;

2、在映射文件中:每个子类不能设置为not null。

    <?xml version="1.0"?>

 

<!DOCTYPE hibernate-mapping PUBLIC

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

 

<hibernate-mapping

    package="com.hbsi.domain">

 

    <class name="Employee" discriminator-value="0">

       <id name="id" column="id">

           <generator class="native"/>

       </id>

       <discriminator column="type" type="int"/>  <!-- 鉴别器。hibrnate 用来区分不同的子类-->

       <property name="name" unique="true"/>

       <many-to-one name="depart" column="depart_id"/>

       <subclass name="Skiller" discriminator-value="1">

           <property name="skill"/>

       </subclass>

       <subclass name="Sales" discriminator-value="2">

           <property name="sell"/>

       </subclass>

    </class>

</hibernate-mapping>

3、编写测试类:

public class TestExtends {

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       //add();

       query(2);

    }

    public static Department add(){

       Session s=null;

       Transaction tx=null;

       try{

           s=HibrnateUtil.getSession();

           tx=s.beginTransaction();

          

           Department dep=new Department();

           dep.setName("department one");

          

           Employee e1=new Employee();

           e1.setName("aaa");

           e1.setDepart(dep);

          

           Skiller e2=new Skiller();

           e2.setName("bbb");

           e2.setDepart(dep);

           e2.setSkill("skill");

          

           Sales e3=new Sales();

           e3.setName("ccc");

           e3.setDepart(dep);

           e3.setSell(100);

          

           s.save(dep);

           s.save(e1);

           s.save(e2);

           s.save(e3);

           tx.commit();

           return dep;

       }finally{

           if(s!=null){

              s.close();

           }

       }

    }

   

    public static void query(int id){

       Session s=null;

       Transaction tx=null;

       try{

           s=HibrnateUtil.getSession();

           tx=s.beginTransaction();

          

           Employee e=(Employee)s.get(Employee.class, id);

           System.out.println("员工名字:"+e.getName());

           System.out.println("员工类型:"+e.getClass());

          

           tx.commit();

       }finally{

           if(s!=null){

              s.close();

           }

       }

    }

}

执行结果:

插入结果:

执行结果:只在一张表中查询。效率高。

 

方式二:每个子类一张表,存放子类所特有的属性,公共的属性是放在父类employee中的。

    没有大量的null,大事表格数量多。

 

1、  在配置文件中:

 

    <class name="Employee">

   

       <id name="id" column="id">

           <generator class="native"/>

       </id>

       <property name="name" unique="true"/>

       <many-to-one name="depart" column="depart_id"/>

       <joined-subclass name="Skiller"> <!-- 子类单独映射成一张表 -->

           <key column=" employee_id "/><!-- 子类的外键 -->

           <property name="skill"/><!-- 子类的属性 -->

       </joined-subclass>

       <joined-subclass name="Sales">

           <key column="employee_id "/>

           <property name="sell"/>

       </joined-subclass>

      

</class>

 

在测试类中:

插入结果:

查询结果:有两个左外连接。效率不高。

Hibernate: select employee0_.id as id3_0_, employee0_.name as name3_0_, employee0_.depart_id as depart3_3_0_, employee0_1_.skill as skill4_0_, employee0_2_.sell as sell5_0_, case when employee0_1_.employee_id is not null then 1 when employee0_2_.employee_id is not null then 2 when employee0_.id is not null then 0 end as clazz_0_ from Employee employee0_ left outer join Skiller employee0_1_ on employee0_.id=employee0_1_.employee_id left outer join Sales employee0_2_ on employee0_.id=employee0_2_.employee_id where employee0_.id=?

 

 

 

 

方式三:

    混合使用“一个类继承体系一张表”和“每个子类一张表” (表结构)

<class name="Employee" table="employee">

    <id name="id">

        <generator class="native"/>

    </id>

    <discriminator column="type"/>

    <property name="name"/>

    <subclass name="Skiller">

        <property name="net"/>

    </subclass>

    <subclass name=”Sales”">

        <join table="sales">

           <key column="employee_id"/>

           <property name="sell"/>

        </join>

    </subclass>

</class>

 

执行结果:

查询结果:查询时,表格employee会和表格sales连接查询。

Hibernate: select employee0_.id as id3_0_, employee0_.name as name3_0_, employee0_.depart_id as depart4_3_0_, employee0_.skill as skill3_0_, employee0_1_.sell as sell4_0_, employee0_.type as type3_0_ from Employee employee0_ left outer join sales employee0_1_ on employee0_.id=employee0_1_.employee_id where employee0_.id=?

 

 

方式四:

每个具体类一张表,表中是子类的完整信息。

<class name="Employee" abstract="true">

    <id name="id">

        <generator class="hilo"/>

    </id>

    <property name="name"/>

    <union-subclass name="Skiller" table="skiller">

        <property name="skill"/>

    </union-subclass>

    <union-subclass name="Sales" table="sales">

        <property name="sell"/>

    </union-subclass>   

</class>

主健不能是identity类型,如果父类是abstract=”true”就不会有表与之对应。

隐式多态,映射文件没有联系,限制比较多很少使用。

 

执行结果:

插入结果:

Hibernate: insert into Department (name) values (?)

Hibernate: insert into Employee (name, depart_id, id) values (?, ?, ?)

Hibernate: insert into Skiller (name, depart_id, skill, id) values (?, ?, ?, ?)

Hibernate: insert into Sales (name, depart_id, sell, id) values (?, ?, ?, ?)

查询结果:子查询

Hibernate: select employee0_.id as id3_0_, employee0_.name as name3_0_, employee0_.depart_id as depart3_3_0_, employee0_.skill as skill4_0_, employee0_.sell as sell5_0_, employee0_.clazz_ as clazz_0_ from ( select id, name, depart_id, order_id, null as skill, null as sell, 0 as clazz_ from Employee union select id, name, depart_id, order_id, skill, null as sell, 1 as clazz_ from Skiller union select id, name, depart_id, order_id, null as skill, sell, 2 as clazz_ from Sales ) employee0_ where employee0_.id=?

 

继承映射的详细解说 继承映射详细,非常实用的学习资料继承映射详细,非常实用的学习资料 立即下载

相关推荐

继承映射的

继承映射

【Hibernate步步为营】--继承映射详解

继承是面向对象很重要的特性,它实现了代码的服用,在关系模型中同样也有继承关系,这种继承关系其实可以看做是一种枚举关系,一种类型中可以枚举出很多子类型,这些子类型和父对象形成了继承关系,能够对其进行枚举的大部分都可以看做是一种继承映射,所以这种枚举关系可以看做是继承映射,

航帆远洋 1万+

Uds诊断自动化(CANoe.diva应用)

(7)其他配置选择可以保持默认(一般情况下,DTC以及31服务、下载服务需要另外测试)。(1)打开CANoe.Diva软件,并新建Diva工程。(2)设置工程名和保存位置;在"Specification file"(3)测试案例打开后的界面如下,可以对要进行测试的案例进行勾选,(可查看下角的进度条)后;(3)等待DIva工程的生成;(4)接下来是修改Diva工程选项,如下图点击。,如用例间的时间间隔、复位等待时间等。,即可打开导入的测试工程。,即可生成测试用例。(1)在CANoe中。

LIUJIAAAAA的博客 3444

18. Hibernate 继承映射

本节课程和大家一起学习继承映射。什么是继承映射;实现继承映射的 3 种方案。

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 1295

查看电脑mac地址+主机名+用户名并导出

张三:李四,应公司要求,今天下班前必须将这张表格里面用户电脑的mac地址统计出来!李四:我该怎么办呢?一个一个查看,太没有效率了吧!对了,我可以做一个bat脚本啊!

拥抱着青春 1974

PCIE配置和地址空间

来源:https://www.jianshu.com/p/574e9a2cbc4e 每个PCIe设备,有这么一段空间,Host软件可以读取它获得该设备的一些信息,也可以通过它来配置该设备,这段空间就叫做PCIe的配置空间。不同于每个设备的其它空间,PCIe设备的配置空间是协议规定好的,哪个地方放什么内容,都是有定义的。PCI或者PCI-X时代就有配置空间的概念,那时的配置空间如下: 图6.1 整个配置空间就是一系列寄存器的集合,其中Type 0是Endpoint的配置,Type 1是Brid.

qq_28643619的博客 4060

继承映射之二具体表映射

继承映射有3种情况: 1.单表继承:每颗继承树使用一个表 table per class hierarchy 2.具体表继承:每个子类一个表 table per subclass 3.类表继承:每个具体类一个表 table per concrete class 有部分限制, 以下,具体表继承: 1.Animal类: package com.cnblogs.hibern...

224

安卓风控对抗实战:如何用AOSP定制ROM绕过Momo、AIDA64等检测(从环境搭建到设备画像)

本文详细解析了如何通过定制AOSP ROM绕过Momo、AIDA64等安卓风控检测工具的设备指纹识别。从环境搭建到硬件参数修改,再到内核级特征混淆,提供了一套完整的底层对抗方案,显著提升设备伪装通过率。

weixin_30687051的博客 490

Kubernetes-核心组件-Kube DNS

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net kube-dns为Kubernetes集群提供命名服务,一般通过addon的方式部署,从v1.3版本开始,成为了一个内建的自启动服务。 kube-dns工作原理 如下图所示,kube-dns由三个容器构成: kube-dns:DNS服务的核心组件,主要由KubeDNS和SkyDNS组成 KubeDNS负责监听Service和Endpoi

了解➔熟悉➔掌握➔精通 3万+

RedVQA:轻量级无参考视频质量评估算法原理与工程实践

视频质量评估是计算机视觉领域的关键技术,旨在通过算法自动量化视频的观看体验。其核心原理在于模拟人眼视觉系统,从像素数据中提取并融合空域和时域特征,以预测主观质量分数。这项技术的价值在于,它能自动化处理海量视频内容的质量监控,为流媒体服务、移动设备影像优化等场景提供关键指标。无参考视频质量评估作为该领域的前沿方向,无需原始无损视频作为参考,更贴合实际应用。本文以RedVQA项目为例,深入剖析了如何利用轻量化的深度网络架构,如MobileNetV3,结合高效的时空特征融合模块,在保证评估精度的同时,大幅降低计算

weixin_28698129的博客 576

零基础玩转STM32CubeIDE LL库:5分钟搞定串口通信(附完整代码)

本文为零基础开发者提供了一份STM32CubeIDE LL库串口通信的快速实战指南。通过CubeMX配置、LL库核心API详解,以及中断接收与环形缓冲区的完整代码实现,帮助读者在5分钟内搭建稳定可靠的串口收发框架,解决从HAL切换到LL库的常见困惑,提升嵌入式开发效率。

weixin_29159441的博客 306

java继承 映射_Hibernate第九篇【组件映射、继承映射】

前言到目前位置,我们已经学习了一对一、一对多、多对一、多对多映射了…既然Hibernate是ORM实现的框架,它还提供了组件映射和继承映射..本博文主要讲解组件映射和继承映射Java主要的类主要有两种方式组合关系,组合关系对应的就是组件映射继承关系,继承关系对应的就是继承映射组件映射组件映射实际上就是将组合关系的数据映射成一张表,组件类和被包含的组件类映射成一张表有的时候,两个类的关系明显不是继承...

weixin_29883023的博客 198

自动驾驶大模型---小米&华科的ORION端到端方案

本文介绍了小米汽车与华中科技大学联合开发的ORION自动驾驶端到端方案。该框架创新性地将视觉语言模型(VLM)与自动驾驶系统结合,包含QT-Former特征提取模块、大语言模型(LLM)推理模块和生成式规划器三大核心组件。通过视觉感知与语言理解的深度融合,ORION能更准确地理解人类指令并生成合理轨迹,同时提升系统的可解释性。实验证明,该方案在准确性、泛化能力和决策透明度方面均有显著优势。ORION框架为自动驾驶技术提供了新思路,有望推动行业向更安全、智能的方向发展。

智能汽车人的博客 2005

继承映射_使用jpaHibernate进行继承映射

继承映射When generating a database using JPA, one of the most important things we have to do is mapping inheritances. In this post, you are going to learn some basic things that we have to know when mappi...

weixin_26705651的博客 185

Power EM与Signal EM解决办法与原理分析

1.面对power EM,首先检查missing via,补全via,还可以加宽,加密局部power mesh,一些power IO出pin有power EM问题,可以叠加多层线和垂直方向补power形成网络降低并联电阻和提供更多电流通路解决,这种方法还可以降低ir drop。3.先进工艺有一个via ladder的方法可以解决power/signal em问题,clock cell出pin绕线或者power rail连接power stripe通过搭梯子的方式连接,原理还是分流。

m0_61544122的博客 4749

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

组件映射、继承映射

一、组件映射 1.概念 类组合关系的映射,也叫作组件映射! 注意:组件类和被包含的组件类,共同映射到一张表! 2.需求 汽车与车轮 3.数据库T_Car 主键 汽车名称 轮子大小 个数 4.Car /** * Created by qianxingzhe on 16/5/28. */ public class Car { private int id; ...

aokouzan2865的博客 156

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

hibernate映射关系——继承映射

今天这篇博客,说的是hibernate的继承映射。 一、以前使用过继承映射吗?       刚听到继承映射的时候,不知道是怎么一回事。视频看完,哦,原来我使用过。没有学习过ORM之类知识的孩子们,如果是第一次听说,不要担心,你们一定使用过,只是不知道它用过这样一个名称而已。看下面的表:          这样的表结构,是不是很熟悉的。这就是继承映射的一种。     特点:

王勇霞 信息技术提高班九期 1987

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JPA实体继承的映射

JPA中对象关系映射通常情况下是一个实体对应一个表,两个实体之间没有任何关系。如果两个实体之间是继承关系,那么该如何映射呢? JPA中的实体支持继承映射,多态关联,多态查询。抽象类和具体的类都可以是实体,且都可以使用@Entity来注解,映射成实体,并查询封装成一个实体。实体类可以继承非实体类,非实体类也可以继承实体类。 JPA的继承映射有如下几种情况: 一、实体类继承抽象(具体

痴人说梦 2万+

Hibernate继承映射之一_用一张表映射

这次给大家发的是hibernate的继承映射,继承映射的实例有很多:例如dog、cat都是animal的子类 这里用的是文章Article、主题Topic和回复Reply给大家做讲解。

机智猫 1万+

Hibernate多对多关联映射和继承映射

多对多关联映射 1、多对多单向关联映射:     如同一般的数据库设计,多对多的关系需要一个第三方表来维护关系,Hibernate中的映射关系也一样,需要一个中间表一样来维护关系,Hibernate会自动生成中间表。使用标签来表示多对多的关联,采用集合的方式来映射字段。    单向关联的映射如下图所示:     用户User类:在User类中持有对Role的引用,采用Set集合

致力于顶级java全栈工程师 1048

【Hibernate】——三种继承映射

说到继承关系,相信我们都很熟悉,比如男人类和女人类继承人类。在hibernate继承映射关系中与对象之间的继承也很类似,它有三中实现策略,即单表继承、集体表继承、类表继承。 单表继承    即每棵类继承一张表,描述一个继承关系只用一张表,子类使用的表与父类相同。     优点:有区分子类的字段,也有描述其他字段的字段,子类的属性不能为空,维护方便,只需修改一张表。

你若盛开,清风自来 684

Hibernate继承关系映射

在关系数据模型中,用外键参照关系来表示继承关系,子类对应的表中存在外键参照父类对应表的主键。继承父类的一些属性,但不用父类作为映射实体时使用注解:@MappedSuperclass。每个子类所对应的表中同时存在从父类继承的属性和自己特有的属性。在表中加入额外的字段区分子类的类型,表中包含父类和所有子类的属性对应的字段。[缺点]:如果要查询父类的对象,必须查询所有具体的子类对应的表。[优点]:如果某个类的属性发生变化,只需要修改该类所对应的表。[缺点]:如果父类的属性发生变化,必须修改所有子类对应的表。

LIUCHANGSHUO的博客 986

HIbernate继承映射

Hibernate 是一个对象关系映射和持久性框架,它提供了许多高级特性,从内省到多态和继承映射。这里讲介绍三个策略,在日常的编程之中您可以用它们把复杂的对象模型容易地映射到关系数据库模型。 继承映射 (1)单表继承即是每棵类继承树使用一个表。如下图: Animal.hbm.xml中的文件代码: 优缺点:首

快乐学习 1680

Hibernate继承映射之二_用多张表映射1

【回顾】Hibernate继承映射之一_用一张表映射 这次给大家带来的是继承映射的第二种方法:用多张表映射,每张表只有自己独立的信息,没有公共字段! 映射情景回顾以及各实体类在这里就不重复写了,需要的都在:http://blog.youkuaiyun.com/nthack5730/article/details/45366983 【因为除了映射文件改变而已】 映射文件,这次只有一个:A

机智猫 1万+
上一篇: 组件映射和集合映射
下一篇: hibrnate内部缓存分析
ping159
博客等级 码龄15年 6粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值