hibernate 继承映射| 耗时:0.352秒|14969条结果

Hibernate继承映射

【前言】     不知道大家是否还记得UML中的四种关系?自己回想了一下,还是没有忘记的,分别是继承、实现、依赖和关联。     怎么突然会想到这样一个问题?是因为在学习完Hibernate关联映射之后,紧接着又来了一个继承映射。关联和继承,都属于四种关系之一,所以,本篇博客就先提了个问题,下面就开始继承映射的学习。 【概述】     继承是面向对象语言的三大重要特性之一,它实现了代码的复用。而Hibernate对于此特性在对应的对象模型配置文件中也作出了各种配置,可将其与关系模型的关系分为三种情况:     1. 每棵类继承树一张表     2. 每个类一张表     3. 每个具体类一张表     下面我们就逐一看看,它们各自生成的关系模型有着哪些不同?以下通过动物类和猪类、鸟类三者间的关系为实例,利用不同继承映射的方法去建表。     三个类之间的关系如下所示: 【一、继承映射之每棵类继承树一张表】     1. 含义:此方法的意思是 不管父类拥有多少个子类,都只会根据父类去生成一张表,而各个子类中有单独的字段,都添加到父类生成的那张表中。     2. 设计: 从图上看,这张表至少包含的字段有:id,name,sex,weight和height。但因为子类不止一个,如果没有一个标识字段,那么就无法从数据表中看到记录是属于哪个子类的。所以,此张表的结构与数据应该如下: t_animal: Id Name Sex Weight Height Type 1 小猪猪 True 200   P 2 小鸟鸟 False   100 B     根据图建立对应的对象模型,也就是所说的实体类,本篇博客中实体类代码就不再展示了。     3. 配置及注释: <?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="com.bjpowernode.hibernate"> <!-- 新建表,名为t_animal。不采用延迟加载 --> <class name="Animal" table="t_animal" lazy="false"> <!-- 该表的主键字段id,生成策略为native --> <id name="id"> <generator class="native"/> </id> <!-- 在父类使用discrimination标签,用来指定标识字段的列名和类型 --> <discriminator column="type" type="string"/> <!-- 父类的name属性 --> <property name="name"/> <!-- 父类的sex属性 --> <property name="sex"/> <!-- 子类Pig,标识字段值为P --> <subclass name="Pig" discriminator-value="P"> <!-- 子类Pig的weight属性 --> <property name="weight"/> </subclass> <!-- 子类Bird,标识字段值为B --> <subclass name="Bird" discriminator-value="B"> <!-- 子类Bird的height属性 --> <property name="height"/> </subclass> </class> </hibernate-mapping>      4. 结果:     5. 小结:     此种方法的结果就是数据库中只有一张根据父类建立的表,而不同子类的子属性也全都写入到这张表中,增加一个区分字段即可。     6. 优缺点:     (1)表中引入的区分子类的字段,也就是包括了描述其他字段的字段。     (2)如果某个子类的某个属性不能为空,那么在数据库一级不能设置该字段not null(非空)     (3)维护起来方便,只需要修改一个表     (4)灵活性差,表中冗余字段会随着子类的增多而越来越多     【二、继承映射之每个类一张表】     1. 含义:此种方法的意思是 每个类都建立一张单独的表。     2. 设计:从图上看,共包含三个类,则应该建立三张表:t_animal、t_pig和t_bird。三张表的结果和数据如下所示:      3. 配置即注释: <?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="com.bjpowernode.hibernate"> <!-- 建立表t-animal --> <class name="Animal" table="t_animal"> <!-- 该表的主键字段id,生成策略为native --> <id name="id"> <generator class="native"/> </id> <!-- t_animal的属性字段name和sex --> <property name="name"/> <property name="sex"/> <!-- joined-subclass生成策略,新建表t_pig --> <joined-subclass name="Pig" table="t_pig"> <!-- 指定了pig子类和animal父类之间是通过pid字段关联 --> <key column="pid"/> <!-- pig子类的子属性,weight --> <property name="weight"/> </joined-subclass> <!-- joined-subclass生成策略,新建表t_bird --> <joined-subclass name="Bird" table="t_bird"> <!-- 指定了bird子类和animal父类之间是通过bid字段关联 --> <key column="bid"/> <!-- bird子类的子属性,height --> <property name="height"/> </joined-subclass> </class> </hibernate-mapping> 4. 结果:     5. 小结:     此种方法的结果是数据库中每个类都对应生成一张表,父类拥有自己的属性字段,子类加上与父类关联的主键字段和自己的子属性。     6. 优缺点:     (1)这种设计方式完全符合关系模型的设计原则,且不存在冗余     (2)维护起来比较方便,对每个类的修改只需要修改其所对应的表,灵活性很好,完全是参照对象继承的方式进行配置     (3)对于父类的查询需要使用左外链接,对于子类查询需要使用内链接     (4)对于子类的持久话至少要处理两个表      【三、继承映射之每个具体类一张表】     1. 含义:此种方法的意思是 每个子类都建立一张单独的表,而父类不生成对应的表。     2. 设计:从图上看,共包含两个具体类,则应该建立两张表:t_pig和t_bird。两张表的结果和数据如下所示:      3. 配置即注释: <?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="com.bjpowernode.hibernate"> <!-- 定义该表的abstract属性为true,则不会生成具体的表 --> <class name="Animal" table="t_animal" abstract="true"> <id name="id"> <!-- 让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。 --> <generator class="assigned"/> </id> <property name="name"/> <property name="sex"/> <!-- union-subclass生成策略,t_pig表的信息是完整的,也就是包含id,name,sex和weight四个字段 --> <union-subclass name="Pig" table="t_pig"> <!-- 子属性字段weight --> <property name="weight"/> </union-subclass> <!-- union-subclass生成策略,t_bird表的信息是完整的,也就是包含id,name,sex和height四个字段 --> <union-subclass name="Bird" table="t_bird"> <!-- 子属性字段height --> <property name="height"/> </union-subclass> </class> </hibernate-mapping> 4. 结果:     5. 小结:     此种方法的结果是数据库中每个子类都对应生成一张表,每个子类的属性是各自的子属性加上父类的共同属性。     6. 优缺点:      (1) 这种设计方式符合关系模型的设计原则,但有表中存在重复字段的问题。      (2) 如果需要对基类进行修改,则需要对基类以及该类的子类所对应的所有表都进行修改               (3) 对于子类的查询只需要访问单独的表,对父类查询需要检索所有的表,对于单个对象持久话操作只需要处理一个表     【总结】     对于这三种继承映射方法,目前还没有在项目中遇到过,所以三者之间如何选择?通常选择什么?都没有概念。不过总体思想应该仍旧是:没有最好,选择合适的就好。也期待在项目中见到对它们的应用。
http://www.itnose.net/detail/6649406.html 2016-10-01 17:19   [Hibernate]

(14)Hibernate继承映射

人们总是在失去时,才了解到事情的本质 需求:动物、猫、猴子 1、简单继承映射 Animal.java package com.rk.hibernate.n_inheritance1; public abstract class Animal
http://www.itnose.net/detail/6532225.html 2016-07-15 05:48   [Hibernate]

hibernate 继承映射(二)

每个子类映射成一张表: 每个具体类映射成一张表:
http://www.itnose.net/detail/6368720.html 2015-09-10 18:24   [Hibernate]

hibernate 继承映射(一)

每棵继承映射成一张表 测试代码: public void testSave1() {         Session session = null
http://www.itnose.net/detail/6368509.html 2015-09-10 16:51   [Hibernate]

JPA Hibernate 继承映射

 在面向对象的程序领域中,类与类之间是有继承关系的,例如Java世界中只需要extends关键字就可以确定这两个类的父子关系,但是在关系数据库中,有的知识关联关系。为了将继承映射到关系数据库中,Hibernate提供了3中方式  整个的继承体系就用一张表(single_table)注解
http://www.itnose.net/detail/6210216.html 2015-02-12 16:09   [Hibernate]

Hibernate 继承映射

原来我们都是先设计数据库在进行代码编写。也就是说都是先有数据库,才有实体对象。但是这种开发思想并不符合我们的面向对象思想。什么是面向对象思想?面向对象是一种对现实世界了解和抽象的方法。通过面向对象方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承。 但是在关系型数据库中的表与表之间的关系,并没有继承关系,不能说一张表继承另一张表,它们之间的关系只能是关联,那么如何将这种继承关系的表映射到我们的数据库当中呢?Hibernate提供了三种基本实现策略。 例如:有如下表继承结构体系:   一、  每棵类继承树基树一张表 该种方案,是将不同的种类动物都放在同一张表。请看下面的继承体系结构:   因为类继承树肯定是对应多个类,要把多个类的信息存放在一张表中,必须有某种机制来区分哪些记录是属于哪个类的。这种机制就是,在表中添加一个字段,用这个字段的值来进行区分。 注意:父类用普通的<class>标签定义 ,在父类中定义一个discriminator,指定这个区分字段的名称和类型。子类用<subclass>标签定义,其中name属性是子类的全路径名。  配置文件实现: <?xml version="1.0" encoding="UTF-8"?> <hibernate-mapping package="com.bjpowernode.hibernate"> <class name="Animal" table="t_animal" lazy="false"> <id name="id"> <generator class="native"/> </id> <discriminator column="type" type="string"/> <property name="name"/> <property name="sex"/> <subclass name ="Pig" discriminator-value="p"> <property name="weight"/> </subclass> <subclass name="Bird" discriminator-value="B"> <property name="height"/> </subclass> </class> </hibernate-mapping>   二、 每个类一张表  除非将父类定义成抽象的,否则父类也是一张表     这种策略使用joined-subclass 标签来定义子类的 。父类、子类、每个类都对应一张数据库表。在父类对应的数据库表中,实际上会存储所有的记录,包括父类和子类的记录;在子类对应的数据库表中,这个表只定义了子类中所特有的属性映射的字段。子类与父类,通过相同的主键值来关联。 注意: 1.父类不再需要定义discriminator字段; 2.子类用<joined-subclass>标签定义,其中name属性是子类的全路径名,需要包含一个key标签,用来指定子类和父类之间是通过哪个字段来关联的。 3.Joined-subclass 标签,既可以被class标签所包含(表名了类之间的继承关系),也可以与class标签所平行。当joined-subclass标签的定义与class标签平行的时候,需要在joined-subclass标签中,添加extends属性,里面的值是父类的全路径名。 4.子类的其他属性,像普通类一样,定义在joined-subclass标签的内部。 配置文件: <?xml version="1.0" encoding="UTF-8"?> <hibernate-mapping package="com.bjpowernode.hibernate"> <class name="Animal" table="t_animal"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <property name="sex"/> <joined-subclass name="Pig" table="t_pig"> <key column="pid"/> <property name="weight"/> </joined-subclass> <joined-subclass name="Bird" table="t_bird"> <key column="bid"/> <property name="height"/> </joined-subclass> </class> </hibernate-mapping>   三、每个具体子类一张表   这种策略是使用union-subclass标签来定义子类的。每个子类对应一张表,而且这个表的信息是完备的,即包含了所有从父类继承下来的属性映射字段。(joined-subclass定义的子类的表,只包含子类特有属性映射字段)。 注意: 1. Union-subclass 标签不再需要包含key标签 2. Union-subclass标签,既可以被class标签所包含(这种包含关系正是表明子类间的继承关系),也可以与class标签平行。当union-subclass标签的 定义域class标签平行的时候,需要在union-subclass标签中,添加extends属性,里面的值是父类的全路径名称。 3. 子类的其他属性,像普通类一样,定义在union-subclass标签的内部。   配置文件: <?xml version="1.0" encoding="UTF-8"?> <hibernate-mapping package="com.bjpowernode.hibernate"> <class name="Animal" table="t_animal"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <property name="sex"/> <union-subclass name="pig" table="t_pig"> <property name="weight"/> </union-subclass> <union-subclass name="Bird" table="t_bird"> <property name="height"/> </union-subclass> </class> </hibernate-mapping>
http://www.itnose.net/detail/6139741.html 2014-10-29 19:13   [Hibernate]

hibernate 继承映射

对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念。Hibernate继承映射可以理解持久化类之间的继承关系。例如:人和学生之间的关系。学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到。 Hibernate支持三种继承映射策略: 使用
http://www.itnose.net/detail/6052235.html 2014-06-01 15:02   [Hibernate]

hibernate继承映射

{ } hibernateTemplate保存S的实例时,只发送S里的属性,也就是说他没有帮我从F里的属性也保存进去,我的表中的字段是对应F和S里的所有属性的,我的F只是作为一个普通共用属性对象而已,请问怎么配置可以让他帮我连父类的属性也一起添加进去 回复讨论(解决方案) 问题已解决 在超类使用
http://www.itnose.net/detail/845379.html 2014-02-21 20:49   [J2EE]

hibernate 继承映射

有谁能帮忙解决一下吗, 回复讨论(解决方案) 分三种: 1。每个实体类一个映射表,比较简单,就是对应有几个数据表就有几个实体类; 2。每个类架构一个映射表,稍微麻烦点,    举例说明:继承User类的DefaultUser及PowerUser
http://www.itnose.net/detail/760958.html 2014-02-20 18:08   [JavaEclipse]

Hibernate 简化继承映射

概述 Hibernate 是一个纯 Java 的对象关系映射和持久性框架,它允许您用 XML 配置文件把普通 Java 对象映射到关系数据库表。使用 Hibernate 能够节约大量项目开发时间,因为整个 JDBC 层都由这个框架管理。这意味着您的应用程序的数据访问层位于 Hibernate 之上
http://www.itnose.net/detail/505771.html 2014-01-25 16:13   [Hibernate]

Hibernate继承映射

三种实现策略: ① 每棵继承映射成一张表 ② 每个子类映射成一张表 ③ 每个具体类映射成一张表    每棵继承映射成一张表  1、理解如何映射  因为类继承树肯定是对应多个类,要把多个类的信息存放在一张表中,必须有某种机制来区分哪些记录是属于哪个类的
http://www.itnose.net/detail/498829.html 2014-01-24 19:53   [Hibernate]

Hibernate(十)继承结构映射

Hibernate继承结构映射有三种实现方式: 使用一张表(映射文件名与超类相同) 每个类一张表(抽象类也对应表。每个表中只有当前类中的属性) 每个具体类对应一张表(抽象类不对应表。每个表中都有全部的信息,包括继承过来的信息) 这里以论坛帖子和回复为例。 使用一张表 超类
http://www.itnose.net/detail/6321995.html 2015-07-19 21:00   [Hibernate]

Hibernate继承映射-多态关联

;/subclass>17 </class> 适用于在继承映射中总是需要多态查询,而且子类的属性相对比较少 (2).每一个具体类一个表 设置类Delivery为abstract在父类的class标签中也加上abstract="true",主键策略不能再使用identity
http://www.itnose.net/detail/527499.html 2014-02-07 14:48   [Hibernate]

解读Hibernate继承映射策略

Hibernate继承映射的英文是Inheritance Mappings,Hibernate继承映射有三种策略,下文对Hibernate继承映射策略具体理解。 Hibernate继承映射的英文是Inheritance Mappings,Hibernate继承映射有三种策略,下文对
http://www.itnose.net/detail/523357.html 2014-02-06 12:37   [Hibernate]

  1  2  3  4  5 下一页>