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

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

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. log4j打印不同颜色

    1.首先在eclipse中安装一个插件: ANSI COLOR 在Eclipse Marketplace 中直接搜索  ANSI COLOR 然后安装 2.在log4j 中加入红色字体部分: < ...

  2. Prism 4 文档 ---第10章 Silverlight和WPF之间共享代码

        本主题帮助你理解来自Prism的多目标和它的优缺点.多目标的代码针对两个不同的平台有大致相同的代码库.这允许同时保持代码尽可能多一样能够产生针对两种不同技术的二进制文件.在这种情况下,本节介绍 ...

  3. LeetCode OJ:Longest Increasing Subsequence(最长递增序列)

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  4. QMainWindow: No such file or directory 问题的解决方法

    这种问题往往是由于QT4的程序转换到QT5所导致的,在.pro文件中加上一句 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 就可以解决问题

  5. New Concept English three (22)

    34w 54 Some plays are so successful that they run for years on end. In many ways, this is unfortunat ...

  6. 疑问:@Autowired的作用?[待解答]

    有下面一个Spring的工程,工程结构如下: 代码如下: applicationContext.xml: <?xml version="1.0" encoding=" ...

  7. LVS模式一:直接路由模式DR(Direct Routing)

    (一)LVS 一.LVS的了解 LVS(Linux Virtual Server)可以理解为一个虚拟服务器系统. Internet的飞速发展,网络带宽的增长,Web服务中越来越多地使用CGI.动态主页 ...

  8. charles抓包unknow

    如果能抓到包,可是解析不出请求,那一定是证书问题,注意以下几点: 1.设备安装证书,注意要抓包的每一个设备都要安装证书,每一个设备! 2.pc端也要安装证书 如果以上两点都做到一定可以解析https请 ...

  9. Linux:declare命令详解

    declare declare命令用于声明和显示已存在的shell变量.当不提供变量名参数时显示所有shell变量.declare命令若不带任何参数选项,则会显示所有shell变量及其值.declar ...

  10. 对map参数进行排序

    /**     * Map转换成url参数 by csl     *     * @param map     * @param isSort 是否排序     * @return     */   ...