知识大全 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之映射继承关系(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 把每个
精通Hibernate之映射继承关系(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在域模
精通Hibernate之映射继承关系三 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! <h
精通Hibernate之映射继承关系二(图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 把每
精通Hibernate之映射继承关系四(图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这种
精通Hibernate之映射继承关系七(图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Co
一对象关系映射基础 对象间的基本关系 首先我简要阐明一下对象之间的基本关系在这以后UML的课程中也会深入的学习对象具有的四种基本关系 关联关系关联关系在设计模式中是被提倡优先使用于继承关系的
依我国《继承法》,关于遗嘱继承与法定继承的关系,正确的选项是__
依我国《继承法》,关于遗嘱继承与法定继承的关系,正确的选项是_____A、遗嘱继承优先于法定继承B、法定继承优先于遗嘱继承C、遗嘱继承与法定继承无所谓谁优先D、遗嘱继承与法定继承不相干答案:A解析:《
Hibernate各种映射关系总结 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 多对一 第一
Hibernate一对多单向关系 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n