需求:学生有很多照片,分为生活照和工作照;

第一节:每个具体类对应一个表                        

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 映射继承的更多相关文章

  1. [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )

    1.继承映射 举例:对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一 ...

  3. Hibernate学习---第八节:继承关系的映射配置

    1.单表继承 (1).实体类,代码如下: package learn.hibernate.bean; import java.util.Date; /** * 持久化类设计 * 注意: * 持久化类通 ...

  4. [原创]java WEB学习笔记86:Hibernate学习之路-- -映射 n-n 关系,单向n-n,双向n-n

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. [原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. [原创]java WEB学习笔记84:Hibernate学习之路-- -映射 一对一关系 ,基外键的方式实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. [原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

  9. Hibernate学习笔记-Hibernate关系映射

    1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...

  10. Hibernate学习0.Hibernate入门

    Hibernate是什么 面向java环境的对象/关系数据库映射工具. 1.开源的持久层框架. 2.ORM(Object/Relational Mapping)映射工具,建立面向对象的域模型和关系数据 ...

随机推荐

  1. 使用游标、存储过程、pivot 三种方法导入数据

    --使用游标循环 if (exists (select * from sys.objects where name = 'Base_RecordTend_Test')) drop proc Base_ ...

  2. 通过网页或Serverice远程系统网站(服务)所在服务器本地的应用程序(未成功)

    近日接了一个奇葩需求,内容如题. 实现过程中遇到一些问题,特将实现过程记录于此,供备忘及参考. 首先尝试了正常启动进程的方法,代码如下: public string RunSPApp() { Proc ...

  3. Linux下MySQL小尝试

    因为我用的linux机器事先已经装好了mysql,所以安装部门就先忽略. 进入mysql,如果发现没权限的话,使用 mysql -uroot -p 输入密码即可 首先我们使用 create datab ...

  4. Webstorm常用快捷键大全

    webstorm应该是目前最强的js编辑器了,结合sublime text可以很效率的开发项目.今天整理了一些webstorm比较实用的快捷键: Ctrl+/ 或 Ctrl+Shift+/ 注释(// ...

  5. Android gradle 安装成功,但是报虚拟机过大的错误处理方法

    一.这个是项目中遇到的问题,记下来,以后再出现方便查看. 1.首先看图吧. 虚拟机内容过大 解决办法: 在.gradle目录下更改配置文件gradle.properjties 里面的 将标记的改成51 ...

  6. 学习三部曲:WHAT、HOW、WHY

    一个人学习的过程要经历以下三步,才可以说得上"学会"两字: 第一步:WHAT 所谓的"WHAT",就是搞清楚某个东东是什么?有什么用?有什么语法?有什么功能特性 ...

  7. HAWQ + MADlib 玩转数据挖掘之(五)——奇异值分解实现推荐算法

    一.奇异值分解简介 奇异值分解简称SVD(singular value decomposition),可以理解为:将一个比较复杂的矩阵用更小更简单的三个子矩阵的相乘来表示,这三个小矩阵描述了大矩阵重要 ...

  8. C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表

    本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何 ...

  9. proc介绍及问题分析

    文件系统 基本介绍 proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口.用户和应用程序可以通过proc得到系统的信息,并可以改变内 ...

  10. Android 编程 高德地图 (实现显示地图以及定位功能)

    本文参考文章: http://www.apkbus.com/blog-904057-63610.html 本人实现的 定位代码:(具体配置省略,可见参考文章) package com.example. ...