继承映射
来源:互联网 发布:庆应大学留学知乎 编辑:程序博客网 时间:2024/06/05 11:29
继承映射
继承是面向对象编程中一个很重要的特征,在做面向对象的分析与设计时,经常会设计出具体继承关联的持久化类,如何把这些持久化类之间的继承关系映射到关系数据库上的问题已解决。继承在对象模型和关系模型上是不匹配的。
方式一:整个的继承体系就用一张表。设计一张表employee
Id name depart_id type skill sell
0 null null
1 Coding null
2 Null 100
public class Employee {
private int id;
private String name;
private Department depart;
//默认的构造方法
//getter和setter方法
}
public class Skiller extends Employee {
private String name;
private String skill;
//默认的构造方法
//getter和setter方法
}
public class Sales extends Employee {
private int sell;
//默认的构造方法
//getter和setter方法
}
映射文件
<classname="Employee" table="employee" discriminator-value="0"><!--unsaved-value="-1"来指定 -->
<id name="id"column="id">
<generator class="native"/><!-- native主键的生成器 自动增长 -->
</id>
<discriminator column="type"type="int"/>
<property name="name"not-null="true"/><!-- 映射普通的java属性 -->
<many-to-one name="depart"column="depart_id"/>
<subclass name="Skiller"discriminator-value="1">
<property name="skill"></property>
</subclass>
<subclass name="Sales"discriminator-value="2">
<property name="sell"></property>
</subclass>
</class>
Type——鉴别器
方式二:每个子类一张表,存放子类所特有的属性(joined)
Employee skiller sales
Id name depart_id employee_id skill employee_id sell
<classname="Employee" table="emplyee">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"not-null="true"/><!-- 映射普通的java属性 -->
<many-to-one name="depart" column="depart_id"/>
<joined-subclass name="Skiller" table="skiller">
<key column="employee_id"></key>
<property name="skill"></property>
</joined-subclass>
<joined-subclass name="Sales" table="sales">
<key column="employee_id"/>
<property name="sell"/>
</joined-subclass>
</class>
方式三:混合使用“一个类继承体系一张表”和“每个子类一张表”
Employee type
Id name depart_id type skill employee_id sell
<classname="Employee" table="employee" discriminator-value="0">
<id name="id">
<generator class="native"></generator>
</id>
<discriminator column="type" type="int"/>
<property name="name"not-null="true"/><!-- 映射普通的java属性 -->
<many-to-one name="depart" column="depart_id"/>
<subclass name="Skiller" discriminator-value="1">
<property name="skill"/>
</subclass>
<subclass name="Sales" discriminator-value="2">
<join table="sales">
<key column="employee_id"/>
<property name="sell"/>
</join>
</subclass>
</class>
方式四:每一个具体类一张表,保存是子类完整信息
<class name="Employee"table="employee">
<id name="id">
<generator class="hilo"/>
</id>
<property name="name" not-null="true"/><!-- 映射普通的java属性 -->
<many-to-one name="depart" column="depart_id"/>
<union-subclass name="Skiller" table="skiller">
<property name="skill"/>
</union-subclass>
<union-subclass name="Sales" table="sales">
<property name="sell"></property>
</union-subclass>
</class>
最后:编写测试类TestExtends.java
package com.hbsi.test;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hbsi.domain.Department;
import com.hbsi.domain.Employee;
import com.hbsi.domain.Sales;
import com.hbsi.domain.Skiller;
import com.hbsi.hibernate.utils.HibernateUtil;
public class TestExtends {
public static void main(String[] args) {
// TODO Auto-generatedmethod stub
add();
//查询
System.out.println("-------------查询的结果----------------");
query(1);
}
static void add(){
Session s=null;
Transaction tx=null;
try{
s=HibernateUtil.getSession();
tx=s.beginTransaction();
//增加
Department depart=new Department();
depart.setName("departmentone");
Employee emp1=new Employee();
emp1.setName("aaa");
emp1.setDepart(depart);
Skiller emp2=new Skiller();
emp2.setName("bbb");
emp2.setDepart(depart);
emp2.setSkill("coding");
Sales emp3=new Sales();
emp3.setName("ccc");
emp3.setDepart(depart);
emp3.setSell(1000);
//保存
s.save(emp1);
s.save(emp2);
s.save(emp3);
s.save(depart);
//提交事务
tx.commit();
}finally{
if(s!=null)
s.close();
}
}
static void query(int empId){
Session s=null;
Transaction tx=null;
try{
s=HibernateUtil.getSession();
tx=s.beginTransaction();
//查询
Employee emp=(Employee) s.get(Employee.class,empId);
System.out.println("员工的姓名:"+emp.getName()+" ,员工类型 :"+emp.getClass());
if(emp instanceof Skiller){
((Skiller) emp).getSkill();
}else if(emp instanceof Sales){
((Sales) emp).getSell();
}
//提交
tx.commit();
}finally{
if(s!=null)
s.close();
}
}
}
- 继承映射
- 继承映射
- 继承映射
- 继承映射
- 继承映射
- 继承映射
- 继承映射
- 继承映射
- 继承映射
- 继承映射
- Hibernate高级映射 --- 继承映射
- Hibernate高级映射--继承映射
- Hibernate高级映射-继承映射
- Hibernate映射解析---继承映射
- Hibernate映射解析---继承映射
- Hibernate映射解析---继承映射
- 组件映射与继承映射
- Hibernate 简化继承映射
- Linux内核大讲堂 (一) 设备驱动的基石驱动模型(4)
- Unix网络编程第一个程序
- ASP.NET GridView总结
- vim命令图表
- 常用WebService一览表
- 继承映射
- Linux 学习 总结
- SQL语句的执行过程
- VC中实现 关闭,开启绘图中的 字体平滑
- [USACO 1.5.4] Checker Challenge
- wamcc:将Prolog编译成C (No.7-4)
- HTML5网址
- 使用GDI绘画图片
- python 中得logging系统