Hebernate -- 映射继承关系
1. Employee 为基类, 派生出HourEmployee 和 SalaryEmployee两个类。
采用 subclass 元素的继承映射(1)
的继承映射可以实现对于继承关系中父类和子类使用同一张表
subclass 来映射子类,使用class
或 subclass
的 discriminator-value
属性指定辨别者列的值
示例代码::
Employee.java
public class Employee {
private Integer id;
private String name; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
HourEmployee.java
/**
* 钟点工
*/
public class HourEmployee extends Employee{ private Double rate; public Double getRate() {
return rate;
} public void setRate(Double rate) {
this.rate = rate;
}
}
SalaryEmployee.java
/**
* 正是员工
*/
public class SalaryEmployee extends Employee { private Double salary; public Double getSalary() {
return salary;
} public void setSalary(Double salary) {
this.salary = salary;
}
}
Employee.hbm.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.extends01.Employee" table="employee" discriminator-value="ee"> <id name="id" type="integer">
<column name="id"/>
<generator class="increment"/>
</id> <!--辨别者列,column="etype"用于区分员工的种类,该配置必须放置在id的后面-->
<discriminator column="etype" type="string"/>
<property name="name" type="string">
<column name="name"/>
</property> <!--配置子类
discriminator-value: 子类对应的辨别者列的值
-->
<subclass name="cn.itcast.extends01.HourEmployee" discriminator-value="he">
<property name="rate" column="rate" type="double"/>
</subclass> <subclass name="cn.itcast.extends01.SalaryEmployee" discriminator-value="se">
<property name="salary" column="salary" type="double"/>
</subclass>
</class>
</hibernate-mapping>
App.java
public class App {
private static SessionFactory sf=null; static{
Configuration config=new Configuration();
config.configure("cn/itcast/extends01/hibernate.cfg.xml");
config.addClass(Employee.class);
sf=config.buildSessionFactory();
} /*
* 知识点1: 保存员工信息
*/
@Test
public void saveStudentAndCoure(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); Employee e=new Employee();
e.setName("xxxx"); HourEmployee he=new HourEmployee();
he.setName("小昭");
he.setRate(10d); SalaryEmployee se=new SalaryEmployee();
se.setName("赵敏");
se.setSalary(3000d); session.save(e);
session.save(he);
session.save(se); tx.commit();
session.close();
} //知识点2: 查询钟点工信息
@Test
public void findHourEmployee(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction();
//HQL语句 可以使用子类HourEmployee
Query query=session.createQuery("from HourEmployee");
query.list(); tx.commit();
session.close();
} }
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <!-- 配置数据库的方言,让hibernate知道连接的是哪个数据库-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 配置利用javaBean和映射文件生成数据库中的表
hibernate.hbm2ddl.auto值
* create:执行时,先查找该表是否存在,如存在先删除表,在创建表
* none:不能创建表,只能往表中插入数据,如表不存在抛出异常,默认值
* update:执行时,
情况一:
先查找该表是否存在,如果表存在,直接插入,如果表不存在,先创建表,再插入数据.
情况二:
先查找该表是否存在,如果表存在,但表的结构不一样,要修改表的结构
-->
<property name="hibernate.hbm2ddl.auto">update</property> <!-- 显示hibernate生成的sql语句 -->
<property name="hibernate.show_sql">true</property> <!-- 显示格式化得sql语句 -->
<property name="hibernate.format_sql">false</property> </session-factory>
</hibernate-configuration>
采用 joined-subclass 元素的继承映射(2)
元素的继承映射可以实现每个子类一张表
key 元素映射共有主键,该主键必须与父类标识属性的列名相同。但如果继承树的深度很深,可能查询一个子类实例时,需要跨越多个表,因为子类的数据一次保存在多个父类中。
代码示例: 未贴出的和(1)相同
Employee.hbm.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.extends02.Employee" table="e_emp" >
<id name="id" type="integer">
<column name="id"/>
<generator class="increment"/>
</id>
<property name="name" type="string">
<column name="name"/>
</property>
<!--
使用joined-subclass映射子类
name="cn.itcast.extends02.HourEmployee":子类的类的完整路径
table="h_emp":子类对应的表
--> <joined-subclass name="cn.itcast.extends02.HourEmployee" table="h_emp">
<!--表示h_emp 表中的主键,同时又是外键-->
<key column="hid"/>
<property name="rate" column="rate" type="double"/>
</joined-subclass> <joined-subclass name="cn.itcast.extends02.SalaryEmployee" table="s_emp">
<key column="sid"/>
<property name="salary" column="salary" type="double"/>
</joined-subclass> </class>
</hibernate-mapping>
App.java
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; public class App {
private static SessionFactory sf=null; static{
Configuration config=new Configuration();
config.configure("cn/itcast/extends02/hibernate.cfg.xml");
config.addClass(Employee.class);
sf=config.buildSessionFactory();
} /*
* 知识点1: 保存员工信息
*/
@Test
public void saveStudentAndCoure(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); Employee e=new Employee();
e.setName("xxxx"); HourEmployee he=new HourEmployee();
he.setName("小昭");
he.setRate(10d); SalaryEmployee se=new SalaryEmployee();
se.setName("赵敏");
se.setSalary(3000d); session.save(e);
session.save(he);
session.save(se); tx.commit();
session.close();
} //知识点2: 查询钟点工信息
@Test
public void findHourEmployee(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction();
//可以使用子类
Query query=session.createQuery("from HourEmployee");
query.list(); tx.commit();
session.close();
} //知识点5: 查询员工信息
@Test
public void findEmployee(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction();
//可以使用子类
Query query=session.createQuery("from Employee");
query.list(); tx.commit();
session.close();
} //知识点6: 删除员工信息(不用使用级联) 删除2号员工
@Test
public void removeEmployee(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); Employee e2=(Employee)session.get(Employee.class, 2); session.delete(e2); tx.commit();
session.close();
} //知识点7:查询唯一的员工,不是钟点工也不是正式员工
@Test
public void findUniqueEmployee(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction(); //sql SELECT * FROM e_emp e WHERE e.id NOT IN(SELECT hid FROM h_emp) AND e.id NOT IN(SELECT sid FROM s_emp)
Query query=session.createQuery("from Employee e where e.id not in(select h.id from HourEmployee h) and e.id not in(select s.id from SalaryEmployee s)");
query.list(); tx.commit();
session.close();
}
}
Hebernate -- 映射继承关系的更多相关文章
- 【hibernate】映射继承关系
[hibernate]映射继承关系 转载:https://www.cnblogs.com/yangchongxing/p/10405151.html ========================= ...
- [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Entity Framework Code First 映射继承关系
转载 http://www.th7.cn/Program/net/201301/122153.shtml Code First如何处理类之间的继承关系.Entity Framework Code Fi ...
- Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
1.继承映射 举例:对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一 ...
- Hibernate(十一):映射继承关系的三种方案
背景: 在一些项目中,会采用集成的关系来定义数据库实体类,比如:人(Person)与学生(Student),学生来源与人,所以人的基本属性学生也拥有:但学生有的一些属性,人就不具有.人与学生之间很显然 ...
- Hibernate逍遥游记-第10章 映射继承关系-003继承关系树中的每个类对应一个表(joined-subclass)
1. 2. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...
- Hibernate逍遥游记-第10章 映射继承关系-002继承关系树中的根类对应一个表(discriminator、subclass)
1. 2. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...
- Hibernate逍遥游记-第10章 映射继承关系-001继承关系树中的每个具体类对应一个表
1. 2. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...
- hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系
hibernate环境配置:导包.... 单向n-1:单向 n-1 关联只需从 n 的一端可以访问 1 的一端 <many-to-one> 元素来映射组成关系: name: 设定待映射的持 ...
随机推荐
- java上传图片,把图片存到本地
思路:js通过FileReader获取图片的Base64,Java解码用IO存到本地. HTML 代码 <input type="file" ng-model="f ...
- 读 下一代SOA 服务技术与面向服务简明指南
面向服务的八个设计原则 标准化服务合同 在同一个服务仓库中的服务都符合同样的合同设计标准 服务松耦合 服务合同施加了消费者低耦合的要求,而它们自己也与周围的环境脱钩 服务抽象 服务合同只包含基本信息, ...
- delphi---EHlib第三方插件----TDBGridEH,TDBNumberEditEh,TDBComboBoxEh
一.TDBGridEH 1.多选 行 options->dgMultiSelect 2.列字体改变颜色,OnDrawColumnCell写下方法. if Column.FieldName='价格 ...
- wget -d --header
wget -d --header="Host:www.sina.com" http://202.108.33.84 domain differ ip 防止Wget递归下载 假设Ng ...
- mysql几种引擎和使用场景
https://blog.csdn.net/cool_wayen/article/details/79585277 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建. ...
- JS当页换图片(分析href所给的信息)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...
- 从es中拉取全部数据/大量数据 使用scroll+scan避免深分页
es一次请求默认返回的数据条数是10条,可以通过设置size参数来控制返回数据的条数: 如果要返回很多数据,可以把size设置的很大,不过elastic search默认size最大不能超过1万. 那 ...
- 三.实例演示insert/update/delect更新数据库
1.逻辑图 2.只是准备 3.代码展示 import pymysql conn=pymysql.connect( host='192.168.199.249', port=3306, user='ro ...
- Redis数据存储优化机制(转)
原文:Redis学习笔记4--Redis数据存储优化机制 1.zipmap优化hash: 前面谈到将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象.省内存的原因是新建一个h ...
- Python爬虫之-Requests
Requests模块 Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了. 它是为另一个时代.另一个互联网所创建的.它需要巨量的 ...