继承映射

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万+

Python爬虫实战:从巨潮资讯网高效获取结构化JSON数据

在数据采集与处理领域,网络爬虫是实现自动化信息获取的核心技术。其基本原理是通过模拟浏览器行为,向目标服务器发送HTTP请求并解析响应内容,从而提取所需数据。相较于传统的网页解析,直接获取结构化数据(如JSON格式)能极大提升数据处理的效率与准确性,避免了复杂的HTML解析或PDF文本提取过程。这一技术价值在金融数据分析、市场研究、舆情监控等场景中尤为突出,能够快速构建高质量的数据集。本文以Python爬虫为例,聚焦于从巨潮资讯网这类官方信息披露平台,精准定位并抓取JSON格式的上市公司年报数据,详细阐述了接

weixin_29243279的博客 1419

18. Hibernate 继承映射

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

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

Plecs仿真进阶:半桥LLC谐振变换器从开环到闭环的实战解析

本文通过Plecs软件,详细解析了半桥LLC谐振变换器从开环模型搭建到闭环控制实现的完整仿真流程。文章深入探讨了谐振参数设置、关键波形解读,并重点分享了基于PI控制器的闭环调试实战经验与参数整定技巧,帮助工程师高效掌握这一高效拓扑的仿真与设计方法。

weixin_29231263的博客 281

【QT开发教程】Qt中的数据加密与解密

在现代应用程序中,数据加密与解密是保护敏感信息的重要手段。Qt本身并不直接提供数据加密与解密的支持,但可以使用第三方库,如OpenSSL或Crypto++,来实现这一功能。本文将介绍如何在Qt中使用OpenSSL进行数据加密与解密,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 1157

继承映射之二具体表映射

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

224

5、癌症数据预处理技术与深度学习在癌症预测中的应用

本文详细介绍了癌症数据预处理技术和深度学习在癌症预测中的应用。针对CT扫描图像、X射线图像、超声图像、基因表达数据和文本数据等不同类型的癌症数据,分别阐述了去噪、插值、配准、归一化等预处理技术的具体方法。同时,分析了深度学习在乳腺癌、白血病和宫颈癌预测中的作用,结合相关影响因素探讨了模型的应用潜力。此外,还总结了深度学习在癌症预测中面临的挑战及未来发展方向,为癌症的早期诊断与精准预测提供了理论支持和技术参考。

alice7model的博客 123

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万+

全志T527-TP9930-Camera

TP9930 驱动模块主要实现将 4 路的 AHD/TVI/CVBS Camera 的数据转换为 BT656/BT1120 数据,从而实现在 T527 端来对数据进行处理和送显。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 3236

GEE 案例分析:利用Landsat数据进行FAI、NDVI及CHLA分析并统计平均值(巢湖为例)

浮游藻类指数(FAI)、归一化植被指数(NDVI)及叶绿素a(CHLA)是水体环境监测的重要指标。本文利用Google Earth Engine(GEE)平台,基于Landsat 5和Landsat 8数据,进行水体藻类及植被监测。

此星光明博客 1336

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

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

weixin_29883023的博客 198

【NI Multisim 14.0原理图设计基础——元器件分类】

电阻(RESISTOR):该元器件栏中的电阻都是标称电阻,是根据真实电阻元器件而设计的,其电阻值不能改变。 排阻(RESISTOR PACK):相当于多个电阻并列封装在一个壳内,它们具有相同的阻值。 电位器(POTENTIOMETER):即可调电阻,可以通过键盘字母动态调节电阻,大写表示增加电阻值,小写表示减小电阻值,调节增量可以设置。 电容(CAPACITOR):所有电容都是无极性的,不能改变参数,没有考虑误差,也未考虑耐压大小。 电解电容器(CAP_ELECTROLIT):所有电容都是有极性的,“+”极

RL2698853114的博客 4万+

继承映射_使用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

Unet++改进33:添加ConvolutionalGLU(2024最新改进方法)|紧凑的网络结构和高效的运算

由于残差连接的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉变形模型往往不能形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,在本文中,我们提出了聚合注意力,这是一种基于仿生设计的令牌混合器,它模拟生物中央凹视觉和连续眼运动,同时使特征映射上的每个令牌具有全局感知。此外,我们结合了可学习的令牌,与传统的查询和键交互,这进一步多样化了亲和矩阵的生成,而不仅仅依赖于查询和键之间的相似性。我们的方法不依赖于堆叠进行信息交换,从而有效地避免了深度退化,实现了自然的视觉感知。

AIcurator的博客 684

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

组件映射、继承映射

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

aokouzan2865的博客 156

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

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

hibernate映射关系——继承映射

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

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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、付费专栏及课程。

余额充值