Hibernate_继承映射

本文深入探讨了面向对象设计中的类与表之间的映射关系,通过三种不同的映射策略展示了如何使用 Hibernate 框架实现 Employee、Sale 和 Skill 类之间的关联。详细解释了如何在单表中整合不同类的属性,并介绍了每个子类单独存储其特有字段的方法,同时提供了相应的 Java 代码示例及数据库表结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、一个子类对应一张表


Employee.java

package org.lazyzhong.model;
public class Employee {
    private int id;
    private String name;

    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;
    }

}

Skill.java

package org.lazyzhong.model;


public class Skill extends Employee{
    private String skiller;

    public String getSkiller() {
        return skiller;
    }

    public void setSkiller(String skiller) {
        this.skiller = skiller;
    }
}

Sale.java

package org.lazyzhong.model;

public class Sale extends Employee {
    private int sell;

    public int getSell() {
        return sell;
    }

    public void setSell(int sell) {
        this.sell = sell;
    }

}

Employee.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lazyzhong.model">
    <class name="Employee" table="employees" abstract="true">  //设置abstract为true不生成employee表
        <id name="id" column="EMPLOYEE_ID">
            <generator class="hilo" />
        </id>
        <property name="name" column="EMPLOYEE_NAME" />
        
        <union-subclass name="Sale" table="SALE">
            <property name="sell" column="SELL"/>
        </union-subclass>
        
         <union-subclass name="Skill" table="SKILL">
            <property name="skiller" column="SKILLER"/>
        </union-subclass>
    </class>
</hibernate-mapping>

Mytest.java

public class MyTest {

	public static void main(String[] args) {
		Configuration cf=new Configuration();
		cf.configure();
		SessionFactory sf=cf.buildSessionFactory();
		Session session=sf.openSession();
		session.beginTransaction();
		
//		Skill skill=new Skill();
//		skill.setName("p1");
//		skill.setSkiller("eating..");
//		
//		Sale sale=new Sale();
//		sale.setName("p2");
//		sale.setSell(10);
//		
//		session.save(skill);
//		session.save(sale);

		
		Employee employee1=(Employee) session.get(Skill.class,1);
		System.out.println(employee1.getName());
		
		Employee employee2=(Employee) session.get(Sale.class,2);
		System.out.println(employee2.getName());
		
		session.getTransaction().commit();
		session.close();
	}

}

表结构

Skill

EMPLOYEE_IDEMPLOYEE_NAMESKILLER

Sale

EMPLOYEE_IDEMPLOYEE_NAMESALE


2、使用一张表表示所有继承体系下的类的属性的并集


还是采用上面的java类...


Employee.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lazyzhong.model">
    <class name="Employee" table="employees">
        <id name="id" column="EMPLOYEE_ID">
            <generator class="hilo" />
        </id>
        <discriminator column="employeeType" type="string"></discriminator>  //作为辨别类型的标志...Employee类中不需要添加这个属性...
        
        <property name="name" column="EMPLOYEE_NAME" />
        
        <subclass name="Sale" discriminator-value="salers">  //salers作为employeeType字段的值...
            <property name="sell" column="SELL"/>
        </subclass>
        
         <subclass name="Skill" discriminator-value="skillers">  //skillers作为employeeType字段的值
            <property name="skiller" column="SKILLER"/>
        </subclass>
    </class>
</hibernate-mapping>


MyTest.java

package org.lazyzhong.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.lazyzhong.model.Employee;
import org.lazyzhong.model.Sale;
import org.lazyzhong.model.Skill;
public class MyTest {

	public static void main(String[] args) {
		Configuration cf=new Configuration();
		cf.configure();
		SessionFactory sf=cf.buildSessionFactory();
		Session session=sf.openSession();
		session.beginTransaction();
		
//		Skill skill=new Skill();
//		skill.setSkiller("eating...");
//		skill.setName("haha");
//		session.save(skill);
		Skill employee=(Skill) session.get(Skill.class,1);
		System.out.println(employee.getName()+"   "+employee.getSkiller());
		
		session.getTransaction().commit();
		session.close();
	}

}


3、每个子类都使用一张表来存储他特有的字段,父类则保存公共的信息...


Employee.java

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lazyzhong.model">
    <class name="Employee" table="employees">
        <id name="id" column="EMPLOYEE_ID">
            <generator class="hilo" />
        </id>
        
        <property name="name" column="EMPLOYEE_NAME" />
        <joined-subclass name="Sale" table="sale">
      		<key column="id" />
            <property name="sell" column="SELL"/>
        </joined-subclass>
        
         <joined-subclass name="Skill" table="skiller">
       		<key column="id" />
            <property name="skiller" column="SKILLER"/>
        </joined-subclass>
    </class>
</hibernate-mapping>


MyTest.java


package org.lazyzhong.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.lazyzhong.model.Employee;
import org.lazyzhong.model.Sale;
import org.lazyzhong.model.Skill;
public class MyTest {

	public static void main(String[] args) {
		Configuration cf=new Configuration();
		cf.configure();
		SessionFactory sf=cf.buildSessionFactory();
		Session session=sf.openSession();
		session.beginTransaction();
		
		Skill skill=new Skill();
		skill.setSkiller("eating...");
		skill.setName("haha");
		session.save(skill);
		
		session.getTransaction().commit();
		session.close();
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值