版权声明:本文为博主原创文章,如需转载请标注转载地址。

博客地址:http://www.cnblogs.com/caoyc/p/5603724.html 

  对于继承关系类的映射。比如在论坛中文章(Ariticla)有主题类型(Topic),有回复类型(Reply)。其中Topic都id、title、context、postDate、type(类型:如普通、精华、置顶......),而Replay有id,title,context,postDate,floor(楼层)。针对这样的情况,Topic和Replay都有共同的属性,那么就可以提取出一个抽象类Ariticla,并给Aritcla添加共同属性id,title,context,postDate。然后让Topic和Reply继承Aritcla,然后各自在指定各自的属性。如图:

  

继承类三种设计方式

第一种:subclass

  这种类型的特点,可以使用一张表来存储所有数据。我们需要在数据库表设计的时候增加一列用于判断该条记录的类型

  Sql数据表结构

  代码实现:

  Article.java

 package com.myproc.domain;

 import java.util.Date;

  public class Article {
private Integer id;
private String title; //标题
private String context; //内容
private Date postDate; //提交日期
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
public Date getPostDate() {
return postDate;
}
public void setPostDate(Date postDate) {
this.postDate = postDate;
}
}

  Topic.java

 package com.myproc.domain;

 public class Topic extends Article {
private int type; //类型:精华、置顶、推荐...... public int getType() {
return type;
} public void setType(int type) {
this.type = type;
} }

  Reply.java

 package com.myproc.domain;

 public class Reply extends Article {
private int floor; //楼层 public int getFloor() {
return floor;
} public void setFloor(int floor) {
this.floor = floor;
} }

  Article.hbm.xml

 <?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.myproc.domain">
<!--discriminator-value:鉴别器的值,如果不指定则为类的全限名(含包) -->
<class name="Article" table="t_article" discriminator-value="A">
<id name="id" column="Id" type="integer">
<generator class="native"></generator>
</id>
<!-- 设置鉴别器,column:在数据库中的列。根据该列的值判断是什么类型 -->
<discriminator column="class_" type="string"></discriminator>
<property name="title" type="string"></property>
<property name="context" type="text" length="1000"></property>
<property name="postDate" type="timestamp"></property> <!-- 子类 -->
<subclass name="Topic" discriminator-value="T">
<!-- 子类属性 -->
<property name="type" type="int"></property>
</subclass> <subclass name="Reply" discriminator-value="R">
<property name="floor"></property>
</subclass>
</class>
</hibernate-mapping>

  这里主要知识点:

  a、subclass:子类的指定

  b、discriminator:鉴别器的设置

  测试代码:

 package com.myproc.test;

 import java.util.Date;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import com.myproc.domain.Article;
import com.myproc.domain.Reply;
import com.myproc.domain.Topic; public class App { private static SessionFactory factory=
new Configuration()
.configure()
.addClass(Article.class)
.buildSessionFactory(); @Test
public void test(){ Session session=factory.openSession();
Transaction tran=session.beginTransaction(); Article article=new Article();
article.setTitle("article");
article.setContext("article.......");
article.setPostDate(new Date()); Topic topic=new Topic();
topic.setTitle("topic");
topic.setContext("topic.......");
topic.setPostDate(new Date());
topic.setType(2); Reply reply=new Reply();
reply.setTitle("reply");
reply.setContext("reply.......");
reply.setPostDate(new Date());
reply.setFloor(1); session.save(article);
session.save(topic);
session.save(reply); tran.commit();
session.close();
}
}

  在数据库中我们可以看到结果:

第二种方式:joined-subclass

  这种方式的特点:有三张表,其中父类对应的表存储公共属性,其它各自的表存储各自的信息,并且在该表中用一个外键引用父类对应的表的主键,如下图:

  

  代码实现:在上例中,我们只需要修改Article.hbm.xml文件,内容如下:

  

 <?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.myproc.domain">
<class name="Article" table="t_article" >
<id name="id" column="Id" type="integer">
<generator class="native"></generator>
</id>
<property name="title" type="string"></property>
<property name="context" type="text" length="1000"></property>
<property name="postDate" type="timestamp"></property> <joined-subclass name="Topic" table="t_topic">
<!-- 指定子类的外键 -->
<key column="id"></key>
<property name="type"></property>
</joined-subclass> <joined-subclass name="Reply" table="t_reply">
<key column="id"></key>
<property name="floor"></property>
</joined-subclass>
</class>
</hibernate-mapping>

  当执行测试代码后:

  在数据库会自动生成3张表

  t_article表中数据:

  

  t_topic

  

  t_reply

  

  

第三种方式:union-subclass

  特点:使用两张表存储数据,如下图:

  同样只需要要修改Article.hbm.xml文件

 <?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.myproc.domain">
<!-- 这里使用abstract=“true”,表示不再数据库中创建对应的表(这里的类不一定是抽象类) -->
<class name="Article" table="t_article" abstract="true">
<id name="id" column="Id" type="integer">
<!-- 这里不能使用identity方式,在hibernate5.2版本也不支持hilo,这里使用MultipleHiLoPerTableGenerator,方式和hilo一样 -->
<generator class="org.hibernate.id.MultipleHiLoPerTableGenerator">
<param name="max_lo">100</param>
</generator>
</id>
<property name="title" type="string"></property>
<property name="context" type="text" length="1000"></property>
<property name="postDate" type="timestamp"></property> <union-subclass name="Topic" table="t_topic">
<property name="type"></property>
</union-subclass> <union-subclass name="Reply" table="t_reply"></union-subclass>
</class>
</hibernate-mapping>

  在测试代码中也不要保存Article父类型的数据

 

Hibernate继承类的实现的更多相关文章

  1. spring+hibernate实体类注解详解(非原创) + cascade属性取值

    @Entity //继承策略.另一个类继承本类,那么本类里的属性应用到另一个类中 @Inheritance(strategy = InheritanceType.JOINED ) @Table(nam ...

  2. HIbernate实体类注解配置

    一.类级别注解 1.@Entity(name="EntityName") 必须 name为可选,对应数据库中一的个表 2.@Table(name="",cata ...

  3. c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具

    c#实例化继承类,必须对被继承类的程序集做引用   0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Cu ...

  4. 转Hibernate继承

    hibernate继承映射 以下测试是在mysql中进行的. 1.单表方式 Animal.java @Entity @Inheritance(strategy=InheritanceType.SING ...

  5. C#基础-事件 继承类无法直接引发基类的事件

    An event can be raised only from the declaration space in which it is declared. Therefore, a class c ...

  6. IOS 杂笔-1(为什么不继承类簇?)

    答:首先,类簇是可以继承的,并不是不可以.例如,我们可以选择继承NSSting,但是此时你用你自己设定的类去调用NSSting的一些方法时,会存在无法实现的问题,这是为什么呢. 1.类簇里有很多私有的 ...

  7. C++浅析——继承类内存分布和虚析构函数

    继承类研究 1. Code 1.1 Cbase, CTEST为基类,CTest2为其继承类,并重新申明了基类中的同名变量 class CBase { public: int Data; CBase() ...

  8. 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

    #include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...

  9. eclipse从数据库逆向生成Hibernate实体类

    做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再“自己”建立一变VO.意思是,在项目设计时,要么 ...

随机推荐

  1. 【LA 3641】 Leonardo's Notebook (置换群)

    [题意] 给出26个大写字母组成 字符串B问是否存在一个置换A使得A^2 = B [分析] 置换前面已经说了,做了这题之后有了更深的了解. 再说说置换群.   首先是群. 置换群的元素是置换,运算时是 ...

  2. noip2012开车旅行 题解

    题目大意: 给出n个排成一行的城市,每个城市有一个不同的海拔.定义两个城市间的距离等于他们的高度差的绝对值,且绝对值相等的时候海拔低的距离近.有两个人轮流开车,从左往右走.A每次都选最近的,B每次都选 ...

  3. 【后缀自动机】CDOJ1551 Hesty Str1ng

    可以发现,对于原串的每个长度>1的子串而言,将其除了最后一个字符之外反向接在其结尾,都是一个合法解.该解的长度一定是奇数. 对于原串的每个长度>2,且结尾两个字符相同的子串而言,将其除了最 ...

  4. 将springboot配置文件中的值注入到静态变量

    SpringBoot配置文件分为.properties和.yml两种格式,根据启动环境的不同获取不同环境的的值. spring中不支持直接注入静态变量值,利用spring的set注入方法注入静态变量 ...

  5. HDU 4576 Robot (很水的概率题)

    Robot Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total Sub ...

  6. WinCE6.0 2012年补丁下载地址

    Windows CE6.0 2012年补丁包WinCEPB60-121231-Product-Update-Rollup-Armv4I.msi下载地址:http://www.microsoft.com ...

  7. 2014 linux

    [51CTO精选译文]每年大概12月前后,人们喜欢给出种种预测,预言他们认为未来一年技术界会出现什么样的变化.本文也不例外,只不过侧重介绍2014年值得关注的十大最受关注的Linux发行版(桌面版或移 ...

  8. MFC进度条刷新处理

    m_p.SetRange(0,1000); m_p.SetStep(1); for (int i=0;i<1001;i++) { m_p.SetPos(i); Sleep(10); MSG ms ...

  9. jquery的表单验证方法,一个function能不能同时捕捉点击事件和按键事件?能不能再优化下,有代码。

    // 该jquery扩展引自 http://www.ghostsf.com/tools/389.html 方法名是作者博客的命名 $.fn.ghostsf_serialize = function ( ...

  10. mysql将字符串字段转为数字排序或比大小

    SELECT * FROM Student WHERE 1 = 1 ORDER BY -ID DESC ; SELECT * FROM Student WHERE 1 = 1 ORDER BY (ID ...