Hibernate 继承 - 每个实现类映射成一个表

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
	}

猜你喜欢

转载自blog.csdn.net/R812656252/article/details/84675280
今日推荐