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

博客地址: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. [USACO 2018 Open Gold] Tutorial

    Link: 传送门 A: 对于每一条分割线,设本不应在其左侧的个数为$x$ 重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去 这样就转直接用树状数组求出最大的$x$即可 ...

  2. 【BFS】【位运算】解药还是毒药

    [codevs2594]解药还是毒药 Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别 ...

  3. 【后缀自动机】【拓扑排序】【动态规划】hihocoder1457 后缀自动机四·重复旋律7

    解题方法提示 小Hi:我们已经学习了后缀自动机,今天我们再来看这道有意思的题. 小Ho:好!这道题目让我们求的是若干的数字串所有不同子串的和. 小Hi:你能不能结合后缀自动机的性质来思考如何解决本题? ...

  4. Spring AOP动态代理

    出现org.springframework.aop.framework.ProxyFactoryBean cannot be cast to 错误 在类型转换的时候, 调用getObject()方法, ...

  5. nginx配置本地https

    客户端如何验证服务器的证书呢?服务器自己的证书必须经过某"权威"证书的签名,而这个"权威"证书又可能经过更权威的证书签名,这么一级一级追溯上去,最顶层那个最权威 ...

  6. Nginx简单认识

    写在前面: 最近一直在学习,这几天了解了下Nginx,虽然看了些资料,斌哥也讲解了一下,但是貌似缺少了实践,就显得对其认识的不那么深刻.这里也还是简单的记录下把. 什么是Nginx? Nginx (e ...

  7. 初识Ant-Design

    设计价值观 Ant-Design在设计方面,存在两个大的价值观,自然和确定.自然即顺其自然,在顺应用户的自我感知和行为方式来开发更自然的产品.确定即探索设计规律,并将其抽象成对象,减少设计者的主观干扰 ...

  8. foreach循环时动态往数组里添加数据

    今天在用TP做项目的时候遇到一个问题,foreach的时候需要动态往数组里添加数据,示例代码如下: $arr = array( array('id'=>'字符串1','name'=>'字符 ...

  9. redis节点管理-新增从节点

    原文:http://blog.sina.com.cn/s/blog_53b45c4d0102wg12.html 新增从节点 新增一个节点7008节点,使用add-node --slave命令. [pl ...

  10. SaltStack–Job管理

    官方文档:https://docs.saltstack.com/en/2016.11/ref/modules/all/salt.modules.saltutil.html 在SaltStack里面执行 ...