知识大全 Hibernate的继承关系

Posted 属性

篇首语:壮心未与年俱老,死去犹能作鬼雄。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Hibernate的继承关系相关的知识,希望对你有一定的参考价值。

Hibernate的继承关系  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

一 每个子类对应一个数据表(Table per concrete class)   学生表     create table `sample` `student`(         `id` bigint not null auto_increment        `name` varchar( ) default not null        `score` float         primary key (`id`)     );     create unique index `PRIMARY` on `sample` `student`(`id`); 教师表     create table `sample` `teacher`(         `id` bigint not null auto_increment        `name` varchar( ) default not null        `salary` float( )         primary key (`id`)     );     create unique index `PRIMARY` on `sample` `teacher`(`id`);   Person抽象基类 public abstract class Person implements java io Serializable     private Long id;     private String name;       /**defaultconstructor*/     public Person()           public Long getId()        returnthis id;         publicvoid setId(Long id)        this id = id;         public String getName()        returnthis name;         publicvoid setName(String name)        this name = name;       子类分别实现它 并添加额外的属性和相应gettter和setter方法 如Student类 public class Student extends Person     private Float score;       public Student()        super();         public Float getScore()        returnscore;         publicvoid setScore(Float score)        this score = score;       hibernate cfg xml <?xml version= encoding= UTF ?> <!DOCTYPE hibernate configuration PUBLIC           //Hibernate/Hibernate Configuration DTD //EN          configuration dtd > <hibernate configuration>       <session factory>        <property name= connection username >root</property>        <property name= connection url >            jdbc:mysql://localhost: /sample        </property>        <property name= dialect >            hibernate dialect MySQLDialect        </property>        <property name= connection password > </property>        <property name= connection driver_class >            mysql jdbc Driver        </property>        <property name= show_sql >true</property>        <property name= current_session_context_class >thread</property>          <mapping resource= powerwind/bean/Student hbm xml />        <mapping resource= powerwind/bean/Teacher hbm xml />       </session factory> </hibernate configuration>   由于Person抽象类没有对应数据库的表 也没有对应的映射文件 在HQL查询中也就不支持多态查询 感觉上 Person抽象类的作用只是减少JAVA代码的编写而已 二 每个类对应一个表(Table per subclass) 人员表 create table `sample` `person`(         `id` bigint not null auto_increment        `name` varchar( )         primary key (`id`)     ); 学生表 create table `sample` `student`(         `id` bigint default not null        `score` float         primarykey (`id`)     ); 教师表 create table `sample` `teacher`(         `id` bigint default not null        `salary` float         primary key (`id`)     );   两个子类的实现和前一种完全一样 Person类也只是去掉 abstract修饰符而已 映射文件只需要Person hbm xml一个即可   <hibernate mapping>     <class name= powerwind bean Person table= person        catalog= sample >        <id name= id type= java lang Long >            <column name= id />            <generator class= native ></generator>        </id>        <property name= name type= java lang String >            <column name= name length= not null= true />        </property>               <joined subclass name= powerwind bean Student            table= student >            <key column= id />            <property name= score type= java lang Float >               <column name= score precision= scale= />            </property>        </joined subclass>               <joined subclass name= powerwind bean Teacher            table= teacher >            <key column= id />            <property name= salary type= java lang Float >               <column name= salary precision= scale= />            </property>        </joined subclass>     </class> </hibernate mapping> 这种方式是支持多态查询的 多态查询语句 Query query=sdao getSession() createQuery( from Person );   三 一个表对多个类(Table per class hierarchy) 人员表     create table `sample` `person`(         `id` bigint not null auto_increment        `name` varchar( )        `score` float        `salary` float        `type` char( )         primary key (`id`)     ); Person hbm xml <hibernate mapping>     <class name= powerwind bean Person table= person        catalog= sample >        <id name= id type= java lang Long >            <column name= id />            <generator class= native ></generator>        </id>        <discriminator column= type type= java lang String />        <property name= name type= java lang String >            <column name= name length= not null= true />        </property>               <subclass name= powerwind bean Student            discriminator value= S >            <property name= score type= java lang Float />        </subclass>               <subclass name= powerwind bean Teacher            discriminator value= T >            <property name= salary type= java lang Float />        </subclass>     </class> </hibernate mapping> 优点是单表查询 支持多态 缺点是要在表增加字段(type)用于区分子类 附加 实体粒度设计 面向设计的细粒度 人员表     create table `sample` `person`(         `id` bigint not null auto_increment        `name` varchar( )        `email` varchar( )        `phone` varchar( )         primary key (`id`)     ); Person类 publicclass Person implements java io Serializable     private Long id;     private String name;     private Contact contact; Contact类 publicclass Contact implements java io Serializable     private String email;     private String phone; 注 以上两个类的代码省略了getter和setter方法 Person hbm xml <hibernate mapping>     <class name= powerwind bean Person table= person        catalog= sample >        <id name= id type= java lang Long >            <column name= id />            <generator class= native ></generator>        </id>        <property name= name type= string column= name />               <ponent name= contact class= powerwind bean Contact >            <property name= email type= string column= email />            <property name= phone type= string column= phone />        </ponent>     </class> </hibernate mapping> 这样的细粒度 有什么用呢?应该在处理比较复杂表结构才体现出来吧   面向性能的细粒度 假如Contact类包含的字段是重量级的数据 如图片之类 而我们一般可能只需要一些简单的信息摘要 要怎么做呢?       create table `sample` `person`(         `id` bigint not null auto_increment        `name` varchar( ) `gender` varchar( )        `email` varchar( )        `phone` varchar( )         primary key (`id`)     ); 首先定义个基类BasePerson publicclass BasePerson     private Long id;     private String name;   Person类继承BasePerson类 添加多一个gender属性 PersonDetail类继承Person类 添加多一个email和phone属性 Person hbm xml     <class name= powerwind bean Person table= person        catalog= sample >        <id name= id type= java lang Long >            <column name= id />            <generator class= native ></generator>        </id>        <property name= name type= string column= name />        <property name= gender type= string column= gender />     </class> PersonDetail hbm xml     <class name= powerwind bean PersonDetail table= person        catalog= sample polymorphism= explicit >        <id name= id type= java lang Long >            <column name= id />            <generator class= native ></generator>        </id>        <property name= name type= string column= name />        <property name= gender type= string column= gender />        <property name= phone type= string column= phone />        <property name= email type= string column= email />     </class>   除了polymorphism= explicit 这一句 和每个子类对应一个数据表的继承关系没有什么区别 正是这句设置 去除了对PersonDetail的隐式多态查询        Query query= getSession() createQuery( from Person );        Query query= getSession() createQuery( from PersonDetail ); 上面两句中 第一句并不会查询到PersonDetail 对象 即查询字段不包括email和phone   注 参考《深入浅出hibernate》一书 cha138/Article/program/Java/ky/201311/28608

相关参考

知识大全 精通Hibernate之映射继承关系(二)

精通Hibernate之映射继承关系(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  把每个

知识大全 精通Hibernate之映射继承关系(一)

精通Hibernate之映射继承关系(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在域模

知识大全 精通Hibernate之映射继承关系三

精通Hibernate之映射继承关系三  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  <h

知识大全 精通Hibernate之映射继承关系二(图)

精通Hibernate之映射继承关系二(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  把每

知识大全 精通Hibernate之映射继承关系四(图)

精通Hibernate之映射继承关系四(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这种

知识大全 精通Hibernate之映射继承关系七(图)

精通Hibernate之映射继承关系七(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Co

知识大全 hibernate关系映射

  一对象关系映射基础  对象间的基本关系  首先我简要阐明一下对象之间的基本关系在这以后UML的课程中也会深入的学习对象具有的四种基本关系  关联关系关联关系在设计模式中是被提倡优先使用于继承关系的

依我国《继承法》,关于遗嘱继承与法定继承的关系,正确的选项是__

依我国《继承法》,关于遗嘱继承与法定继承的关系,正确的选项是_____A、遗嘱继承优先于法定继承B、法定继承优先于遗嘱继承C、遗嘱继承与法定继承无所谓谁优先D、遗嘱继承与法定继承不相干答案:A解析:《

知识大全 Hibernate各种映射关系总结

Hibernate各种映射关系总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  多对一  第一

知识大全 Hibernate一对多单向关系

Hibernate一对多单向关系  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!   &n