当前位置: 首页 > 编程日记 > 正文

Hibernate之继承映射

Hibernate的继承映射可以理解为两个持久化类之间的继承关系    例如老师和人之间的关系

持久化类  Person类

public  class  Person

{

private   Integer    id;

privvate  String     name;

private    String    sex;

public   Person (){}                //  无参构造器

public   Person(Integer id,String  name, String sex)           // 带参数的构造器

{

this.id = id;

this.name = name;

this.sex   =  sex;

}

.............                                           //省略   id属性  name属性  sex属性  的 setter和getter方法

}

持久化  Teacher类

public  class   Teacher   extends   Person

{                                                           //  继承了父类的全部Field

private   String   className;          //所带班级名

private   String   subject;               //所教科目名

public   Teacher(){}                       //无参构造器

public   Teacher(String id,Sting  name ,String  sex,String  className, String subject)

{

super(id,name,sex);                     //显示调用父类带三个参数的构造器

this.className  = className;

this.subject  =  subject;

}

........//    继承了父类的getter和 setter方法  省略className属性  subject属性的getter和setter方法

}

有三种方式的继承映射 :

1.采用<subclass>元素的继承映射

在这种映射策略下,持久化父类  和 持久化子类 的实例对应的记录都将保存在一张数据表中。该数据表中额外需要增加一个数据列来记录该行记录是哪个类的实例。

这个列被称为辨别者列(discriminator).

该数据表有父类和所有子类的所有属性所对应的数据列   ,哪个对象实例如果没有该列的属性 ,则这个对象实例的对应记录的这列为null

映射文件配置如下 :

<class  name="org.lingtong.pojo.Person" table="tb_person_info"  discriminator-value="普通人">            //discriminator-value属性指定该持久化类的对象的辨别值   如果不写默认为全限定类名

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

<generator  class="native">                           //指定主键生成器策略

</id>

<discriminator  column="FLAG"  type="string"  />     //  映射辨别列

....                                                              //省略 name属性 sex属性与对应数据列的映射关系

<subclass  name="org.lingtong.pojo.Teacher"  discriminator-value="老师” />             //discriminator-value属性指定该持久化类的对象的辨别值   如果不写默认为全限定类名

.........                                                //省略 className属性   subject属性与对应数据列的映射关系

//可以继续嵌套子类    但是永远保存在一张表中

</subclass>

</class>

2.采用<joined-subclass>元素的继承映射

采用这种策略  ,父类实例的属性保存在父类表中 ,而子类实例的属性则由父类表和子类表共同存储。将父类和子类共有的属性(即子类通过继承而来的属性)保存在父类表中 ,子类自己扩张增加的属性,则保存在子类表中 。

使用这种映射策略,无需使用辨别者列。但是需要为每个子类表使用<key>元素指定一列去关联父类表的主键列 。<key>元素对应的列 即充当主键又充当外键。

这种关系可以看成“纵向分割映射”

father 类              son类                   grandson类

id                        id                         id

name                  name                    name                                          //则 三个共有属性  形成父类表

sex                      sex                      sex

--------------------------------------------------------------

position                 position                                        //则  两个 子类和孙子类的 共有属性  形成子类表

wife                       wife                                               //需要指定一列 去关联父类表的主键列     (该列既是主键又是外键)

---------------------------------------------------------------

age                                               //则   两个 由孙子类的 特有属性     形成孙子表

sport                                              //需要指定一列   去关联之类表的主键列       (该列既是主键又是外键)

---------------------------------------------------------------

映射文件配置

<class  name="org.lingtong.pojo.Father" table="tb_person_info1"  >            //discriminator-value属性指定该持久化类的对象的辨别值   如果不写默认为全限定类名

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

<generator  class="native">                           //指定主键生成器策略

</id>

....                                                              //省略 name属性 sex属性与对应数据列的映射关系

<joined-subclass  name="org.lingtong.pojo.Son"    table="tb_person_info2" />

<key  column="son_id">

.....                                                // 省略  position属性 与 wife属性与对应数据列的映射关系

<joined-subclass  name="org.lingtong.pojo.Son"    table="tb_person_info3" />

<key  column="grandson_id">

......                                    // 省略   age属性 与 sport属性与对应数据列的映射关系

</joined-subclass>

</joined-subclass>

</class>

通过这种映射方式形成的数据表

查询孙子类的实例对象对应的记录时   需要跨越三张表

查询子类的实例对象对应的记录时需要跨越两张表

查阅父类的对象实例对应的记录需要一张表

3.采用<union-subclass>元素的继承映射

"横向分割映射"

转载于:https://www.cnblogs.com/wangliyue/p/4151864.html

相关文章:

AutoML未来可期,工程师的明天何去何从?

人工智能和机器学习建模专业技术人才紧缺&#xff0c;即使是高水平的人工智能专家&#xff0c;在大数据智能分析机器学习建模时&#xff0c;主要依靠人工经验&#xff0c;建模过程费时费力&#xff0c;缺少有效方法。为了解决这一突出问题&#xff0c;国内外出现了一种用机器学…

海思3559A上编译Valgrind源码操作步骤

注&#xff1a;按照以下步骤可以在海思板子上正常编译valgrind源码并生成valgrind可执行文件,但可能还不能在海思板子上正常使用。 1. 从http://valgrind.org/downloads/?srcwww.discoversdk.com 下载Valgrind 3.15.0即valgrind-3.15.0.tar.bz2&#xff1b; 2. 在valgrind-3…

Swift之SDWebImage第三方框架

在学习Swift过程中&#xff0c;最害怕的使用了OC的第三方框架 好不容易配置成功了&#xff0c;却出现了意外的Bug [UIImageView setImageWithURL:]: unrecognized selector sent to instance解决办法 第一次配置的时候&#xff0c;因为百度了教程&#xff0c;所以一次性成功…

文件分区格式化及挂载

创建一个5G的分区&#xff0c;文件系统为ext2&#xff0c;卷标为DATA&#xff0c;块大小为1024&#xff0c;预留管理空间为磁盘分区的8%&#xff1b;挂载至/backup目录&#xff0c;要求使用卷标进行挂载&#xff0c;且在挂载时启动此文件系统上的acl功能&#xff1b;在虚拟机创…

iOS开发swift版异步加载网络图片(带缓存和缺省图片)

iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似&#xff0c;只是代码比较简单&#xff0c;功能没有SD的完善与强大&#xff0c;支持缺省添加图片&#xff0c;支持本地缓存。 异步加载图片的核心代码如下&#xff1a; func setZYHWebImage(url:NSStr…

2097352GB地图数据,AI技术酷炫渲染,《微软飞行模拟器》游戏即将上线

整理 | 若名出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;“只要是真实存在的地方&#xff0c;你都能抵达。”作为即将成为第一款将整个地球化作虚拟世界来供玩家玩的游戏&#xff0c;微软的《微软飞行模拟器》&#xff08;Microsoft Flight Simulator&#xff09;…

开源库nothings/stb的介绍及使用(图像方面)

GitHub上有个开源的stb库&#xff0c;Star数已过万&#xff0c;地址为https://github.com/nothings/stb&#xff0c;为何叫stb&#xff0c;是用的作者名字的缩写Sean T. Barrett。此库仅包含头文件&#xff0c;除stretchy_buffer.h外&#xff0c;其它所有文件以前缀stb开头&…

git stuff

git stuff trick git bash 无法标记复制解决办法 git bash窗口左上角图标点击,选择属性->选项->快速编辑模式 确定就ok了 Usual Commands 创建分支git branch branch-namegit push origin branch-name 删除分支git branch -r -d origin/branch-name 删除远程分支git push…

swift3.0之闭包

Swift 相比原先的 Objective-C 最重要的优点之一&#xff0c;就是对函数式编程提供了更好的支持。 Swift 提供了更多的语法和一些新特性来增强函数式编程的能力&#xff0c;本文就在这方面进行一些讨论。 Swift 概览 对编程语言有了一些经验的程序员&#xff0c;尤其是那些对多…

Linux下gdb attach的使用(调试已在运行的进程)

在Linux上&#xff0c;执行有多线程的程序时&#xff0c;当程序执行退出操作时有时会遇到卡死现象&#xff0c;如果程序模块多&#xff0c;代码量大&#xff0c;很难快速定位&#xff0c;此时可试试gdb attach方法。 测试代码main.cpp如下&#xff0c;这里为了使程序退出时产生…

一行Python代码能实现这么多丧心病狂的功能?(代码可复制)

最近看知乎上有一篇名为《一行 Python 能实现什么丧心病狂的功能&#xff1f;》&#xff08;https://www.zhihu.com/question/37046157&#xff09;的帖子&#xff0c;点进去发现一行Python代码可以做这么多丧心病狂的功能&#xff01;整理了一下知乎上这篇文章的内容&#xff…

一步一步写算法(之图结构)

原文:一步一步写算法&#xff08;之图结构&#xff09; 【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图是数据结构里面的重要一章。通过图&#xff0c;我们可以判断两个点之间是不是具有连通性…

FFmpeg中可执行文件ffprobe用法汇总

从https://ffbinaries.com/downloads 下载最新的4.1版本的Windows 64位FFprobe&#xff0c;FFprobe用于从多媒体流中获取相关信息或查看文件格式信息&#xff0c;并以可读的方式打印&#xff0c;FFprobe可以作为一个命令行程序单独使用。 通过执行以下命令将FFprobe信息重定位…

CocoaPods导入的库其头文件导入的方法

尽管CocoaPods使用十分方便,但其导入的第三方框架还是要经过几步操作,才能供项目使用; 第一步:导入库 1>-在终端进入项目的根目录; 2>-输入:touch Podfile,则项目文件夹会创建一个空的Podfile,这时,你可以将你想要导入的库写在里面.如: platform :ios, 6.0 pod RESid…

Google、微软、阿里、腾讯、百度这些大公司在GitHub上开源投入排名分析 | CSDN原力计划...

扫码参与CSDN“原力计划”作者 | 村中少年来源 | CSDN原力计划获奖作品现在有越来越多的公司都参与了开源&#xff0c;其背后有各自的目的所在&#xff0c;姑且不予讨论。本文是从多个方面分析各大公司在开源上的投入情况。由于全世界绝大多数的开源项目都有发布到Github上&…

jquery源码解析:each,makeArray,merge,grep,map详解

jQuery的工具方法&#xff0c;其实就是静态方法&#xff0c;源码里面就是通过extend方法&#xff0c;把这些工具方法添加给jQuery构造函数的。 jQuery.extend({ ...... each: function( obj, callback, args ) { //$.each(arr , function(i,value){}),第三个参数用于…

swift实现提示框第三方库:MBProgressHUD

GitHud的下载地址是&#xff1a;https://github.com/jdg/MBProgressHUD/ 下载完成后&#xff0c;将MBProgressHUD.h和MBProgressHUD.m拖入已经新建好的Swift项目。因为使用的swift语言&#xff0c;所以拖入项目的时候会提示是否新建一个桥接objective-c与swift的文件&#xff…

这段Python代码让程序员赚300W,公司已确认!网友:神操作!

Python到底还能给人多少惊喜&#xff1f;笔者最近看到了这两天关于Python最热门的话题&#xff0c;关于《地产大佬潘石屹学Python的原因》&#xff0c;结果被这个回答惊到了&#xff1a;来源&#xff1a;知乎 https://www.zhihu.com/question/355880221笔者翻了翻那些回答&…

FFmpeg中可执行文件ffmpeg用法汇总

从https://ffbinaries.com/downloads 下载最新的4.1版本的Windows 64位FFmpeg&#xff0c;FFmpeg是一个快速的音频/视频转换工具&#xff0c;FFmpeg可以作为一个命令行程序单独使用。 通过执行以下命令将FFmpeg信息重定位到ffmpeg_help.txt文件中便于查看&#xff0c;其内容如…

下载Ext JS 5.1 gpl版本的方法

先进入官网&#xff1a;http://www.sencha.com然后在导航的Products中选择Sencha Ext JS&#xff0c;会看到以下页面&#xff1a;这时候不要单击Download按钮&#xff0c;而是要单击导航中的DETAILS&#xff0c;页面切换后&#xff0c;就可在底部看到GPL版本的下载按钮了&#…

对MBProgressHUD进行封装并精简使用

几个效果图&#xff1a; 以下源码是MBProgressHUD支持最新的iOS8的版本&#xff0c;没有任何的警告信息 MBProgressHUD.h 与 MBProgressHUD.m MBProgressHUD.hMBProgressHUD.m以下是本人在MBProgressHUD基础上封装的类&#xff0c;觉得部分的使用基于block ShowHUD.h 与 Show…

基于Hash的消息认证码HMAC简介及在OpenSSL中使用举例

HMAC(Hash-based Message Authentication Code)&#xff1a;基于Hash的消息认证码&#xff0c;是一种通过特别计算方式之后产生的消息认证码(MAC)&#xff0c;使用密码散列函数&#xff0c;同时结合一个加密密钥。它可以用来保证数据的完整性&#xff0c;同时可以用来作某个消息…

英特尔发布oneAPI软件计划及beta产品,面向异构计算提供统一可扩展的编程模型

近日&#xff0c;在2019年超级计算大会上&#xff0c;英特尔发布了一项全新软件行业计划oneAPI&#xff0c;助力充分释放高性能计算与人工智能技术融合时代多架构计算的潜力&#xff0c;同时发布了一个oneAPI beta产品。 英特尔oneAPI行业计划&#xff0c;为跨多种包括CPU、GP…

Mac下配置Maven

1.Java环境变量设置就不说。 但是配置Maven需要检查下Java环境变量的设置。需要检查JAVA_HOME环境变量以及Java命令 wanyakundeMacBook-Pro:Library wanyakun$ echo $JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home wanyakundeMacBook-Pro:Librar…

UIAlertAction的用法

let alertController UIAlertController(title:"系统提示", message:"您确定要退出程序吗&#xff1f;", preferredStyle: .alert) let cancelAction UIAlertAction(title:"取消", style: .cancel, handler:nil) let okAction UIAlertAction(tit…

在Windows和Linux上编译gRPC源码操作步骤(C++)

gRPC最新发布版本为v1.23.0&#xff0c;下面以此版本为例说明在Windows和Linux下编译过程。 Windows7/10 vs2103编译gRPC源码操作步骤&#xff1a; 1. 需要本机已安装Git、CMake、Perl、Go、yasm&#xff1b; 2. 依次执行如下命令&#xff1a; git clone https://github.co…

这些算法工程师,他们真的是太难了!

现在的算法工程师真的是太难了&#xff01;要让AI会看人眼都分辨不清的医疗影像数据又不够&#xff0c;还得用前沿技术好不容易学会看片&#xff0c;还要让AI会分析病理赋予AI诊断疾病的使命然后几十种模型&#xff0c;N次计算只给一张显卡Boss就问&#xff1a;你打算怎么做&am…

Java 汉子转拼音

1. 引入: pinyin4j-1.1.0 包; http://pan.baidu.com/s/1eQ8a874 2. 转换; private static String ChineseToPinyin(String name){String pinyinName"";char[] nameChar name.toCharArray(); HanyuPinyinOutputFormat defaultFormat new HanyuPinyinOutputFormat()…

Swift - 使用Alamofire通过HTTPS进行网络请求,及证书的使用

&#xff08;本文代码已升级至Swift3&#xff09; 我原来写过一篇文章介绍如何使用证书通过SSL/TLS方式进行网络请求&#xff08;Swift - 使用URLSession通过HTTPS进行网络请求&#xff0c;及证书的使用&#xff09;&#xff0c;当时用的是 URLSession。本文介绍如何使用 Alam…

gRPC简介及简单使用(C++)

gRPC是一个现代的、开源的、高性能远程过程调用(RPC)框架&#xff0c;可以在任何平台运行。gRPC使客户端和服务器端应用程序能够透明地进行通信&#xff0c;并简化了连接系统的构建。gRPC支持的语言包括C、Ruby、Python、Java、Go等。 gRPC默认使用Google的Protocol Buffers&a…