版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/R812656252/article/details/84675280
Hibernate 继承
类与类之间的继承是Java的绝对核心,hibernate作为一个用于ORM框架,将类与类之间的继承映射成表的关系,也是hibernate所支持的功能之一。
实际上在hibernate中有三种方式支持这一特性。
1. 每个实现类映射成一个表
2. 根类映射成一个表
3. 每个类都映射成一个类
为了描述这种关系,工作图片和生活图片都继承自图片类/接口,每个图片都属于一个学生,实现:查询一个学生下所有的图片。
每个实现类映射成一个表
- Image.java 抽象类
package com.java1234.hibernate.model;
public abstract class Image {
private int id;
private String name;
//建立student对象,用于映射student信息。
private Student student;
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 Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
- LifeImages.java
package com.java1234.hibernate.model;
public class LifeImages extends Image{
private int id;
private String name;
//建立student对象,用于映射student信息。
private Student student;
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 Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
- WorkImages.java
package com.java1234.hibernate.model;
public class WorkImages extends Image{
private int id;
private String name;
//建立student对象,用于映射student信息。
private Student student;
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 Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
- Student.java
package com.java1234.hibernate.model;
import java.util.Set;
public class Student {
private int id;
private String name;
private Set<Image> images;
public Set<Image> getImages() {
return images;
}
public void setImages(Set<Image> images) {
this.images = 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;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}
- lifeImage.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.java1234.hibernate.model.LifeImages" table="tb_lifeImg">
<id name="id" column="lifeImgId">
<generator class="native"/>
</id>
<property name="name" column="lifeImgName"/>
<many-to-one name="student" class="com.java1234.hibernate.model.Student" column="stuId" cascade="save-update"/>
</class>
</hibernate-mapping>
- workImage.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.java1234.hibernate.model.LifeImages" table="tb_lifeImg">
<id name="id" column="lifeImgId">
<generator class="native"/>
</id>
<property name="name" column="lifeImgName"/>
<many-to-one name="student" class="com.java1234.hibernate.model.Student" column="stuId" cascade="save-update"/>
</class>
</hibernate-mapping>
- student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.java1234.hibernate.model.Student" table="tb_student">
<id name="id" column="stuId">
<generator class="native"/>
</id>
<property name="name" column="stuName"/>
</class>
</hibernate-mapping>
生成的表结构/SQL
Hibernate: create table tb_lifeImg (lifeImgId integer not null auto_increment, lifeImgName varchar(255), stuId integer, primary key (lifeImgId))
Hibernate: create table tb_student (stuId integer not null auto_increment, stuName varchar(255), primary key (stuId))
Hibernate: create table tb_workImg (workImgId integer not null auto_increment, workImgName varchar(255), stuId integer, primary key (workImgId))
Hibernate: alter table tb_lifeImg add constraint FK_cb4uw507aecbenhaihjrythw foreign key (stuId) references tb_student (stuId)
Hibernate: alter table tb_workImg add constraint FK_kjo52qqv4vm5fulws5xfhb0fd foreign key (stuId) references tb_student (stuId)
插入
执行时SQL: Hibernate: insert into tb_student (stuName) values (?)
//由于Image是一个抽象类,所以在studnet一侧无法配置set以实现一对多关系。在插入/查询Student时无法插入/查询出对应的图片信息
@Test
public void testInsertStudnet(){
session.beginTransaction();
Student student = new Student();
student.setName("Robin");
Image image1 = new WorkImages();
image1.setName("Office view");
Image image2 = new WorkImages();
image2.setName("WorkStation view");
Image image3 = new LifeImages();
image3.setName("ThanksGiving Day");
Set<Image> images = new HashSet<Image>();
images.add(image1);
images.add(image2);
images.add(image3);
student.setImages(images);
session.save(student);
session.getTransaction().commit();
}
如果通过反向,则会级联保存成功。
@Test
public void testInsertImages(){
session.beginTransaction();
Student student1 = new Student();
student1.setName("Robin");
Student student2 = new Student();
student2.setName("Mary");
Image image1 = new WorkImages();
image1.setName("Office view");
Image image2 = new WorkImages();
image2.setName("WorkStation view");
Image image3 = new LifeImages();
image3.setName("ThanksGiving Day");
image1.setStudent(student1);
image2.setStudent(student2);
image3.setStudent(student1);
session.save(image1);
session.save(image2);
session.save(image3);
session.getTransaction().commit();
}