1、discriminator鉴别器
同一张表中表示不同的类型
在employee表中定义一个type字段,表示员工的类型
name是所有的员工都有的属性。
sale_count是销售员特有的属性。
而skiller是技术人员特有的属性。
三个实体类:
Employee:
package cn.framelife.mvc.entity;
import java.io.Serializable;
public class Employee implements Serializable {
private Integer id;
private String name;
public Employee() {
}
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;
}
}
Sales:
package cn.framelife.mvc.entity;
public class Sales extends Employee {
private Integer saleCount;
public Integer getSaleCount() {
return saleCount;
}
public void setSaleCount(Integer saleCount) {
this.saleCount = saleCount;
}
}
Skiller:
package cn.framelife.mvc.entity;
public class Skiller extends Employee {
private String skiller;
public String getSkiller() {
return skiller;
}
public void setSkiller(String skiller) {
this.skiller = skiller;
}
}
Employee.hbm.xml:
<hibernate-mapping>
<!-- discriminator-value="0"鉴别器父类Employee默认的类型为0 -->
<class name="cn.framelife.hibernate.entity.Employee" table="employee" catalog="hibernate" discriminator-value="0">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<!-- 配置鉴别器,配置表中的类型字段 -->
<discriminator column="type"></discriminator>
<property name="name" type="java.lang.String">
<column name="name" length="45" not-null="true" />
</property>
<!-- 配置Employee的子类,并且设定类型的值 discriminator-value-->
<subclass name="cn.framelife.hibernate.entity.Sales" discriminator-value="1">
<property name="saleCount" column="sale_count"></property>
</subclass>
<subclass name="cn.framelife.hibernate.entity.Skiller" discriminator-value="2">
<property name="skiller" column="skiller"></property>
</subclass>
</class>
</hibernate-mapping>
增加操作:
tx = session.beginTransaction();
//1、增加一个Employee
// Employee employee = new Employee();
// employee.setName("a");
// session.save(employee);
//2、增加一个Skiller
// Skiller skiller = new Skiller();
// skiller.setName("b");
// skiller.setSkiller("kill somebody");
// session.save(skiller);
//3、增加一个Sales
Sales sales = new Sales();
sales.setName("c");
sales.setSaleCount(100);
session.save(sales);
tx.commit();
2、joined-subclass内连接
一张表表示一种类型
实体类与discriminator鉴别器的一样。
Employee.hbm.xml:
<hibernate-mapping>
<class name="cn.framelife.hibernate.entity.Employee" table="employee"
catalog="hibernate">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="45" not-null="true" />
</property>
<!-- 这里是关键配置 -->
<joined-subclass name="cn.framelife.hibernate.entity.Skiller"
table="skiller">
<key column="id"></key>
<property name="skiller" column="skiller"></property>
</joined-subclass>
<joined-subclass name="cn.framelife.hibernate.entity.Sales"
table="sales">
<key column="id"></key>
<property name="saleCount" column="sale_count"></property>
</joined-subclass>
</class>
</hibernate-mapping>
增加操作与discriminator鉴别器的一样。
3、union-subclass
这种方法在表设计的时候不需要employee表,只需要子表。
实体类与discriminator鉴别器的一样。
Employee.hbm.xml:
<class name="cn.framelife.hibernate.entity.Employee" catalog="hibernate">
<!-- 这里的id生成策略不能使用数据库自增长(indentity,或者是像native,如果你使用的是数据库自增长的话).可以使用hilo或者increment -->
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="45" not-null="true" />
</property>
<!-- 这里是关键配置 -->
<union-subclass name="cn.framelife.hibernate.entity.Skiller" table="skiller">
<property name="skiller" column="skiller"></property>
</union-subclass>
<union-subclass name="cn.framelife.hibernate.entity.Sales" table="sales">
<property name="saleCount" column="sale_count"></property>
</union-subclass>
</class>
</hibernate-mapping>
增加操作与discriminator鉴别器的一样。
分享到:
相关推荐
第12章 映射继承关系 12.1 继承关系树的每个具体类对应一个表 12.1.1 创建映射文件 12.1.2 操纵持久化对象 12.2 继承关系树的根类对应一个表 12.2.1 创建映射文件 12.2.2 操纵持久化对象 12.3 继承...
第12章 映射继承关系 12.1 继承关系树的每个具体类对应一个表 12.1.1 创建映射文件 12.1.2 操纵持久化对象 12.2 继承关系树的根类对应一个表 12.2.1 创建映射文件 12.2.2 操纵持久化对象 12.3 继承...
第12章 映射继承关系 12.1 继承关系树的每个具体类对应一个表 12.1.1 创建映射文件 12.1.2 操纵持久化对象 12.2 继承关系树的根类对应一个表 12.2.1 创建映射文件 12.2.2 操纵持久化对象 12.3 继承...
第12章 映射继承关系 12.1 继承关系树的每个具体类对应一个表 12.1.1 创建映射文件 12.1.2 操纵持久化对象 12.2 继承关系树的根类对应一个表 12.2.1 创建映射文件 12.2.2 操纵持久化对象 12.3 继承...
第12章 基于annotation注解技术的ssh 2整合开发 12.1 初识annotation522 12.2 亲身体验annotation的威力524 12.3 struts 2.x的annotation插件convention-plugin528 12.4 hibernate 3.x的annotation解决之道532 ...
5. **第7章 高级实体关联映射**:深入讲解了关联映射的高级特性,如双向关联、懒加载、级联操作、集合的有序性和唯一性约束,以及如何处理多对多关联。 6. **第9章 使用对象**:讲述了如何通过Session进行对象的...
##### 1.2 第二部分 — 关联映射 此章节深入探讨了 Hibernate 中对象之间的关联映射。 - **1.2.1 映射 Person 类**:通过映射一个具体的 `Person` 类来展示一对一、一对多等关联类型的实现。 - **1.2.2 单向 Set-...
第9部分 实体数据建模基础之继承关系映射TPH 第10部分 实体数据建模基础之两实体间Is-a和Has-a关系建模、嵌入值映射 第11部分 查询之异步查询 第12部分 查询之使用SQL语句 第13部分 查询之使用Entity SQL 第14部分 ...
第7章 高级实体关联映射 7.1 单值的实体关联 7.1.1 共享的主键关联 7.1.2 一对一的外键关联 7.1.3 用联结表映射 7.2 多值的实体关联 7.2.1 一对多关联 7.2.2 多对多关联 7.2.3 把...
本课件的第9章聚焦于面向对象方法论在软件工程中的应用,特别是第三堂课的内容,可能会深入探讨预约登记表和病人属性在系统中的角色。 面向对象分析的目标是识别问题域中的关键概念,并将它们映射为软件系统中的类...
OODBS的出现是为了克服传统关系数据库在处理复杂数据结构和继承关系时的局限性。然而,OODBS面临的问题包括缺乏统一标准和与关系数据库系统的不兼容性,这限制了其广泛应用。 9.3 面向对象数据库设计——ODL ODL...
- **实现继承**:讨论如何利用 Hibernate 支持的继承映射策略来映射继承结构。 - **实现 equals() 和 hashCode()**:确保持久化类正确实现这两个方法以支持对象比较。 #### 五、基本 ORM 映射 - **映射声明**:讲解...
本章解释了ORM标识的重要性,通过解释映射的继承和关联关系来建立预备知识。 第四章深入的介绍一些重要的概念:实体的生命周期,持久化状态,等同性。让我们了解这些知识是如何通过NHibernate 的API进行权衡。了解...
9. **工具使用**:标签中的“工具”可能指的是利用Java的并发库或其他第三方工具(如Apache Commons、Guava等)来辅助线程管理和配置。 10. **最佳实践**:自定义线程配置时,应遵循一些最佳实践,如合理设置线程池...
1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 ...