Hibernate学习7—Hibernate 映射继承
第一节:每个具体类对应一个表
Student.java:
package com.cy.model;
import java.util.Set;
public class Student {
private int id;
private String name;
private Set<Image> images;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Image> getImages() {
return images;
}
public void setImages(Set<Image> images) {
this.images = images;
}
}
抽象类Image.java:
package com.cy.model;
public abstract class Image {
private int id;
private String imageName;
private Student student;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getImageName() {
return imageName;
}
public void setImageName(String imageName) {
this.imageName = imageName;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
生活照LifeImage.java:
package com.cy.model;
public class LifeImage extends Image{
}
工作照WorkImage.java:
package com.cy.model;
public class WorkImage extends Image{
}
Student.hbm.xml:
<hibernate-mapping package="com.cy.model">
<class name="Student" table="t_student">
<id name="id" column="stuId">
<generator class="native"></generator>
</id>
<property name="name" column="stuName"></property>
</class>
</hibernate-mapping>
LifeImage.hbm.xml:
<hibernate-mapping package="com.cy.model">
<class name="LifeImage" table="t_lifeImage">
<id name="id" column="lifeImageId">
<generator class="native"></generator>
</id>
<property name="imageName" column="imageName"></property>
<many-to-one name="student" column="stuId" class="com.cy.model.Student"></many-to-one>
</class>
</hibernate-mapping>
WorkImage.hbm.xml:
<hibernate-mapping package="com.cy.model">
<class name="WorkImage" table="t_workImage">
<id name="id" column="workImageId">
<generator class="native"></generator>
</id>
<property name="imageName" column="imageName"></property>
<many-to-one name="student" column="stuId" class="com.cy.model.Student"></many-to-one>
</class>
</hibernate-mapping>
测试代码StudentTest.java:
@Test
public void testGetAllImages(){
List<Image> imageList = new ArrayList<Image>();
int stuId = 1;
List<Image> lifeImageList = (List<Image>)session.createQuery("from LifeImage l where l.student.id = " + stuId).list();
imageList.addAll(lifeImageList);
List<Image> workImageList = (List<Image>)session.createQuery("from WorkImage w where w.student.id = " + stuId).list();
imageList.addAll(workImageList);
for(Image image: imageList){
System.out.println(image.getImageName());
} }
三个表的关联关系:

t_lifeimage表结构:

t_lifeimage表数据:

t_workimage表数据:

第二节:根类对应一个表
Student2.java:
package com.cy.model;
import java.util.Set;
public class Student2 {
private int id;
private String name;
private Set<Image2> images;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Image2> getImages() {
return images;
}
public void setImages(Set<Image2> images) {
this.images = images;
}
}
Image2.java:
package com.cy.model;
public class Image2 {
private int id;
private String imageType;
private String imageName;
private Student2 student;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getImageName() {
return imageName;
}
public void setImageName(String imageName) {
this.imageName = imageName;
}
public Student2 getStudent() {
return student;
}
public void setStudent(Student2 student) {
this.student = student;
}
public String getImageType() {
return imageType;
}
public void setImageType(String imageType) {
this.imageType = imageType;
}
}
LifeImage2.java:
package com.cy.model;
public class LifeImage2 extends Image2{
}
WorkImage2.java:
package com.cy.model;
public class WorkImage2 extends Image2{
}
Student2.hbm.xml:
<hibernate-mapping package="com.cy.model">
<class name="Student2" table="t_student2">
<id name="id" column="stuId">
<generator class="native"></generator>
</id>
<property name="name" column="stuName"></property>
<set name="images">
<key column="stuId"></key>
<one-to-many class="com.cy.model.Image2"/>
</set>
</class>
</hibernate-mapping>
Image2.hbm.xml:
<hibernate-mapping package="com.cy.model">
<class name="Image2" table="t_image2">
<id name="id" column="imageId">
<generator class="native"></generator>
</id>
<!-- 用来区分是LifeImage2还是WorkImage2 -->
<discriminator column="imageType" type="string"></discriminator>
<property name="imageName" column="imageName"></property>
<many-to-one name="student" column="stuId" class="com.cy.model.Student2"></many-to-one>
<subclass name="com.cy.model.LifeImage2" discriminator-value="life"></subclass>
<subclass name="com.cy.model.WorkImage2" discriminator-value="work"></subclass>
</class>
</hibernate-mapping>
hibernate.cfg.xml中只需加入两项映射配置就行了:
<mapping resource="com/cy/model/Student2.hbm.xml"/>
<mapping resource="com/cy/model/Image2.hbm.xml"/>
测试代码:
@Test
public void testGetAllImages2(){
Student2 s2 = (Student2) session.get(Student2.class, 1);
Set<Image2> images = s2.getImages();
Iterator<Image2> it = images.iterator();
while(it.hasNext()){
Image2 image = it.next();
System.out.println(image.getImageName());
}
}

生成的t_image2表结构:

第三节:每个类对应一个表
Student3.java:
package com.cy.model;
import java.util.Set;
public class Student3 {
private int id;
private String name;
private Set<Image3> images;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Image3> getImages() {
return images;
}
public void setImages(Set<Image3> images) {
this.images = images;
}
}
Image3.java:
package com.cy.model;
public class Image3 {
private int id;
private String imageName;
private Student3 student;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getImageName() {
return imageName;
}
public void setImageName(String imageName) {
this.imageName = imageName;
}
public Student3 getStudent() {
return student;
}
public void setStudent(Student3 student) {
this.student = student;
}
}
WorkImage3.java:
package com.cy.model;
public class WorkImage3 extends Image3{
}
LifeImage3.java:
package com.cy.model;
public class LifeImage3 extends Image3{
}
Student3.hbm.xml:
<?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.cy.model"> <class name="Student3" table="t_student3">
<id name="id" column="stuId">
<generator class="native"></generator>
</id>
<property name="name" column="stuName"></property> <set name="images">
<key column="stuId"></key>
<one-to-many class="com.cy.model.Image3"/>
</set> </class> </hibernate-mapping>
Image3.hbm.xml:
<hibernate-mapping package="com.cy.model">
<class name="Image3" table="t_image3">
<id name="id" column="imageId">
<generator class="native"></generator>
</id>
<property name="imageName" column="imageName"></property>
<many-to-one name="student" column="stuId" class="com.cy.model.Student3"></many-to-one>
<joined-subclass name="com.cy.model.LifeImage3" table="t_lifeImage3">
<key column="lifeImageId"></key>
</joined-subclass>
<joined-subclass name="com.cy.model.WorkImage3" table="t_workImage3">
<key column="workImageId"></key>
</joined-subclass>
</class>
</hibernate-mapping>
hibernate.cfg.xml中加入如下映射关系:
<mapping resource="com/cy/model/Student3.hbm.xml"/>
<mapping resource="com/cy/model/Image3.hbm.xml"/>
测试代码:
@Test
public void testGetAllImages3(){
Student3 s3 = (Student3) session.get(Student3.class, 1);
Set<Image3> images = s3.getImages();
Iterator<Image3> it = images.iterator();
while(it.hasNext()){
Image3 image = it.next();
System.out.println(image.getImageName());
}
}
查看生成的表:

t_image3的表结构:

Hibernate学习7—Hibernate 映射继承的更多相关文章
- [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
1.继承映射 举例:对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一 ...
- Hibernate学习---第八节:继承关系的映射配置
1.单表继承 (1).实体类,代码如下: package learn.hibernate.bean; import java.util.Date; /** * 持久化类设计 * 注意: * 持久化类通 ...
- [原创]java WEB学习笔记86:Hibernate学习之路-- -映射 n-n 关系,单向n-n,双向n-n
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记84:Hibernate学习之路-- -映射 一对一关系 ,基外键的方式实现
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate学习(二)关系映射----基于外键的单向一对一
事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...
- Hibernate学习笔记-Hibernate关系映射
1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...
- Hibernate学习0.Hibernate入门
Hibernate是什么 面向java环境的对象/关系数据库映射工具. 1.开源的持久层框架. 2.ORM(Object/Relational Mapping)映射工具,建立面向对象的域模型和关系数据 ...
随机推荐
- kali linux下不能以root权限运行vlc的解决办法
习惯了在Linux下面使用VLC播放视频和音乐, 但是 VLC 的 linux 版本并不支持在root下面运行. 终端运行vlc命令报错,错误信息如下 root@kbdancer:~# vlc VLC ...
- Ubuntu下sh *.sh使用==操作符执行报错
----<鸟哥的Linux私房菜--基础篇>学习笔记 ubuntu默认的sh是连接到dash,而我们写shell脚本时使用的时bash.bash和dash在一些方面是不兼容的.因此执行同一 ...
- sed和awk简介
什么是sed和awk sed和awk是Linux环境下数据的处理工具,可以完成对数据的增删改查的功能. sed处理时是以行尾单位的,awk处理数据时以字段为单位. se ...
- JSP的EL和JSTL解析
1. EL 简介EL 全名为Expression Language,所有EL都是以${ 为起始.以} 为结尾的.EL 语法很简单,它最大的特点就是使用上很方便. 接下来介绍EL 主要的语法结构: ${ ...
- C语言编程的两个工具:valgrind和core
检查内存泄漏: valgrind --leak-check=full ./ecox_rws_helper 来检查内存泄漏 程序崩溃看错误: ulimit -c unlimited 然后执行程序,会在当 ...
- StringUtils.isEmpty和StringUtils.isBlank的区别
两个方法都是判断字符是否为空的.前者是要求没有任何字符,即str==null 或 str.length()==0:后者要求是空白字符,即无意义字符.其实isBlank判断的空字符是包括了isEmpty ...
- vue中axios的深入使用
如上所示一条简单的请求数据,用到了vue中axios,promise,qs等等 这里我将vue中用到的axios进行了封装方便日后使用 先对工具类进行封装utils/axios.js: // 引入模 ...
- Licp - 一个玩具解释器的实现
纸上得来终觉浅,绝知此事要躬行. 最近看了 SICP,其第四章讲述了一个简单的 Scheme 解释器的实现.粗看了一遍后决定自己用 C 语言实现一个残疾的 Scheme 解释器,想来这样的学习效果应该 ...
- Hive中日期处理
1.日期函数UNIX时间戳转日期函数:from_unixtime() 函数 格式 返回值 说明 from_unixtime from_unixtime(bigint unixtime[, string ...
- NSURLSession学习笔记(一)简介
一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁盘缓存的持久化策略,使用用户keychain ...