- 浏览: 3462746 次
- 性别:
- 来自: China
文章分类
- 全部博客 (536)
- ajax (1)
- Algorithm (14)
- Android (40)
- CSS/HTML... (2)
- defy (3)
- DesignPattern (2)
- dorado (0)
- Drools (6)
- English/日本語 (7)
- Flex (2)
- Framework (0)
- Google (3)
- hibernate (13)
- homework (3)
- HTML5 (0)
- IDE (29)
- java (45)
- javaee (7)
- Javascript (14)
- java组件 (5)
- jQuery (4)
- jsp (8)
- jsf (2)
- Linux (2)
- lucene (0)
- mysql (6)
- news (3)
- Oracle (8)
- other (4)
- PHP (5)
- Python (0)
- Software Engineering (3)
- spring (7)
- struts1.x (14)
- struts2.x (14)
- strolling in cloud (1)
- subject:javaEnhance (20)
- Tomcat (7)
- validator (3)
- 学习·方法·心得 (8)
- .NET (2)
- vba (6)
- groovy (5)
- grails (2)
- SWT (0)
- big data (1)
- perl (1)
- objective-c (50)
- product (1)
- mac (7)
- ios (188)
- ios-phone (2)
- ios-system (15)
- ios-network (5)
- ios-file (4)
- ios-db (1)
- ios-media (3)
- ios-ui (27)
- ios-openSource (6)
- ios-animation (5)
- ios-drawing (7)
- c (2)
- ios-app (2)
- ios-course (15)
- ios-runtime (14)
- ios-code (8)
- ios-thread (8)
- ios-LBS (2)
- ios-issue (1)
- ios-design (2)
- Jailbreak (2)
- cocos2d (0)
- swift (16)
- ios-framework (4)
- apple watch (4)
- ios-web (1)
- react native (3)
- TVOS (1)
- OpenGL (1)
最新评论
-
xiaobinggg:
...
Session机制详解 -
菜鸟学生会:
Drools规则工作流引擎开发教程网盘地址:http://pa ...
Drools入门-----------环境搭建,分析Helloworld -
wangyudong:
不是很好用,不支持自动化测试RESTful API,也不支持自 ...
Simple REST Client POST使用方法 -
Paul0523:
很棒的一篇文章,感谢楼主分享
Session机制详解 -
啸笑天:
获取原型对象的三种方法<script>functi ...
复习JavaScript面向对象技术
一、继承关系_整个继承树映射到一张表
对象模型(Java类结构)
一个类继承体系一张表(subclass)(表结构)
Employee.java
package com.taobao.hibernate.domain; public class Employee { private int id; private String name; private Department department; 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 Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } }
Skiller.java
package com.taobao.hibernate.domain; public class Skiller extends Employee { private String skill; public String getSkill() { return skill; } public void setSkill(String skill) { this.skill = skill; } }
Sales.java
package com.taobao.hibernate.domain;
public class Sales extends Employee {
private String sell;
public String getSell() {
return sell;
}
public void setSell(String sell) {
this.sell = sell;
}
}
这里我们考虑设计数据库是把员工都涉及在一张表,那么如何区分员工种类呢?加入员工类型这个字段来区别。
只需更改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 package="domain"> <class name="Employee" discriminator-value="0"> <id name="id"> <generator class="native"/> </id> <discriminator column="type" type="int"></discriminator> <property name="name"></property> <many-to-one name="dpt" column="dpt_id" lazy="false"></many-to-one> <subclass name="Skiller" discriminator-value="1"> <property name="skill" ></property> </subclass> <subclass name="Sales" discriminator-value="2"> <property name="sell"></property> </subclass> </class> </hibernate-mapping>
<discriminator column="type" type="int"/>中的type默认值是string。
所有子类定义的字段不能为空。
使用了<discriminator column="type" type="int"></discriminator>这个标签,就是映射了type字段,然后Hibernate会根据type字段的值来确定从数据库中取过来的是什么对象。
在查询的get方法时,也可以自动识别,会自动用相对应的对象去封装数据。
一个继承树映射到一张表的话,会有很多空字段,不符合关系数据库的设计模式。
二、继承关系_每个类映射到一张表
这时候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 package="domain"> <class name="Employee"> <id name="id"> <generator class="native"/> </id> <property name="name"></property> <many-to-one name="dpt" column="dpt_id" lazy="false"></many-to-one> <joined-subclass name="Skiller"> <key column="employee_id"></key> <property name="skill"></property> </joined-subclass> <joined-subclass name="Sales"> <key column="employee_id"></key> <property name="sell"></property> </joined-subclass> </class> </hibernate-mapping>
<joined-subclass name="Sales">
子类对应类名为Sales,表名为Sales
<key column="employee_id"></key>
通过employee_id与Employee表关联
<property name="sell"></property>
设置sell属性
</joined-subclass>
这样就完成了Hibernate的配置,生成的表符合上面所说的表结构。
Hibernate: insert into Department (name) values (?)
插入部门
Hibernate: insert into Employee (name, dpt_id) values (?, ?)
插入销售员工到员工表
Hibernate: insert into Sales (sell, employee_id) values (?, ?)
插入销售员工到销售员工表
Hibernate: insert into Employee (name, dpt_id) values (?, ?)
插入技术员工到员工表
Hibernate: insert into Skiller (skill, employee_id) values (?, ?)
插入技术员工到技术员工表
5条插入信息
现在又有问题了,既然用到了多表关联,那么删除这些级联操作会怎么样呢
Hibernate: delete from Sales where employee_id=?
Hibernate: delete from Employee where id=?
发现两条delete语句很好的将员工信息删除掉了。
这里还需要注意的是,查询的时候避免使用多态查询,多表连接查询效率较低,最好明确指定查询的类别,不要直接用员工类进行查询。
三、继承关系_鉴别器与内连接相结合
把属性不多的类对应的列放到父类列中,把子类属性多的单独用一个表。这里假设Sales有很多列
内容和上两篇没有什么大的区别,原理类似,只是标签上略有不同。
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 package="domain">
<class name="Employee" discriminator-value="0">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="int"/>
<property name="name"></property>
<many-to-one name="dpt" column="dpt_id" lazy="false"></many-to-one>
<subclass name="Skiller" discriminator-value="1">
<property name="skill"></property> </subclass>
<subclass name="Sales" discriminator-value="2">
<join table="sales">
<key column="employee_id"></key>
<property name="sell"></property>
</join>
</joined-subclass>
</class>
</hibernate-mapping>
四、继承关系_每.类映射一张独立表
可见表之间都是独立的,没有关联的。
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 package="domain"> <class name="Employee"> <id name="id"> <generator class="hilo"/> </id> <property name="name"></property> <many-to-one name="dpt" column="dpt_id" lazy="false"></many-to-one> <union-subclass name="Skiller"> <property name="skill"></property> </union-subclass> <union-subclass name="Sales"> <property name="sell"></property> </union-subclass> </class> </hibernate-mapping>
这种方式的局限在于,如果一个属性在超类中做了映射,其字段名必须与所有子类表中定义的相同(Hibernate可能在后续版本中放宽此限制)。除此之外,使用union-subclass映射策略是不可使用identity的主键生成策略,因为同一类继承层次中所有实体类都需要使用同一个主键种子(即多个持续化实体对应的记录的主键是连续的)。受此影响,也不应该使用native主键生成策略,因为native会根据数据库来选择使用identity或sequence策略。,所以不要native,identity,sequence主键生成策略,可以是increment,hilo。
如果父类是abstract=”true”就不会有表与之对应。
隐式多态,映射文件没有联系,限制比较多很少使用。
发表评论
-
OpenSessionInViewFilter 的配置及替代方案
2011-09-19 14:39 42661Spring 为我们提供了一个叫做 OpenSessionIn ... -
OpenSessionInViewFilter源码分析
2011-09-19 14:28 2725从书上我了解到Session接口是Hibernate向 ... -
hibernate-3.2.5.ga的hibernate.properties
2011-06-07 21:32 2733######################### Query ... -
Hibernate3的配置参数汇总
2011-06-07 21:26 5089SQL方言1、Hibernate JDBC属 ... -
Hibernate异常与会话
2011-06-07 16:59 2659Hibernate的事务和并发 Hibernate的事务和并发 ... -
Hibernate事务
2011-06-07 16:03 8472JDBCTransaction 单个数据库(一个Se ... -
Hibernate缓存
2011-06-06 15:34 2123缓存的作用主要用来提高性能,可以简单的理解成一个Ma ... -
Hibernate懒加载
2011-06-06 02:35 1566通过asm和cglib二个包实现;Domain是非fin ... -
Hibernate 积累
2011-05-29 11:08 1751解决实体类或属性名 ... -
hibernate.current_session_context_class
2011-05-27 15:10 29540遇到过的问题: 情景1: 在使用SessionFactor ... -
Hibernate的一对一关联实例
2010-10-24 11:15 0Hibernate的一对一关联实例 Hibernate中 ... -
Hibernate code
2010-10-24 10:46 0<?xml version=" ... -
Hibernate遇到过的问题
2010-05-27 00:46 14521 执行到中途产生这个异常:org.hibernate.ex ... -
hbm2ddl.auto属性详解(hibernate自动建表)
2010-05-22 17:45 9509hibernate配置属性中,hi ...
相关推荐
本主题聚焦于“用Hibernate映射继承关系”,我们将深入探讨Hibernate如何处理对象的继承层次结构,并将其映射到数据库中的表。 Hibernate支持多种继承策略,包括单一表继承(Single Table Inheritance)、联合表...
Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了多种方式来处理继承关系的映射,其中一种就是"每个类都对应一张表"的策略。本文将深入探讨这种映射方式,以及如何在Hibernate中实现它。 首先,...
本话题主要探讨的是Hibernate 3.2版本中的类继承关系处理,这是面向对象编程中常见的概念,但在数据库映射时需要特殊考虑。在Hibernate中,类继承关系的处理允许我们创建更加灵活和可扩展的对象模型。 在Hibernate ...
本文将详细探讨Hibernate中处理继承关系的三种映射策略:subclass、joined-subclass以及union-subclass。 首先,让我们理解继承关系在面向对象编程中的重要性。继承允许我们创建一个类(子类)作为另一个类(父类)...
在大型项目中,由于业务需求复杂,我们常常会使用到类的继承来组织代码结构,而Hibernate提供了对这些继承关系的映射支持。本主题将深入探讨"Hibernate继承映射+C3P0代码"的相关知识点。 首先,让我们理解Hibernate...
总的来说,“union-subclass”是Hibernate提供的一种处理继承关系的方法,它允许我们有效地将复杂的面向对象设计映射到数据库中,同时也为我们的查询提供了灵活性。在实际开发中,熟练掌握和运用这种策略,可以提高...
Hibernate 允许在没有继承关系的类之间创建具体化类,这是一种特殊形式的继承。具体化类在数据库中拥有单独的表,但它们并不是Java中的子类。这种模式适用于实体类具有大量重叠属性,且子类之间几乎没有共同属性的...
标题:“Hibernate继承关系映射.pdf” 描述:“简明扼要地介绍了Hibernate中继承关系的映射方式,深入探讨了三种不同的映射策略及其优缺点,同时解析了多态查询的概念。” 知识点: ### Hibernate继承关系映射...
在ORM(Object-Relational Mapping)框架如Hibernate中,如何优雅地将这些继承关系映射到关系型数据库中,成为了一个重要的议题。本文将深入探讨Hibernate如何处理继承多态映射关系,主要通过三种不同的策略来实现这一...
类的继承关系,如`Son`继承自`Father`。在Hibernate中,这种关系不需要特别的映射,因为Java的继承机制已经处理了对象间的层级关系。 9. **实现(Implementation)**: 类实现接口,如`BaseDAO`实现`IOperator`...
Hibernate继承映射是将Java类的继承关系映射到数据库表的一种策略,使得对象模型的复杂性能够平滑地转化为关系数据库模型。本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承...
6. **继承关系映射**:Hibernate支持类的继承关系映射,包括单表继承(Single Table Inheritance)、联合继承(Concrete Table Inheritance)和歧视值继承(Discriminator Value Inheritance)。单表继承所有子类...
12. **继承映射**:支持单表继承、联合继承和表-per-hierarchy等多种方式,使对象模型的继承关系得以在数据库中体现。 13. **延迟加载(Lazy Loading)**:默认情况下,关联的对象不会立即加载,只有在真正需要时才...
Hibernate继承映射是将Java中的继承关系映射到数据库的关系模型中。在Java中,一个基类可以有多个子类,而在数据库中,这些子类可以共享一张表或者各自拥有独立的表,这取决于我们选择的继承策略。Hibernate提供了四...
2. **对象状态**:Hibernate管理的对象具有三种状态:瞬时态(Transient)、持久态(Persistent)和脱管态(Detached),它们的状态转换由Hibernate的Session负责。 3. **JMX集成**:允许通过JMX(Java Management ...