Hibernate继承类的实现
版权声明:本文为博主原创文章,如需转载请标注转载地址。
博客地址: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继承类的实现的更多相关文章
- spring+hibernate实体类注解详解(非原创) + cascade属性取值
@Entity //继承策略.另一个类继承本类,那么本类里的属性应用到另一个类中 @Inheritance(strategy = InheritanceType.JOINED ) @Table(nam ...
- HIbernate实体类注解配置
一.类级别注解 1.@Entity(name="EntityName") 必须 name为可选,对应数据库中一的个表 2.@Table(name="",cata ...
- 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 ...
- 转Hibernate继承
hibernate继承映射 以下测试是在mysql中进行的. 1.单表方式 Animal.java @Entity @Inheritance(strategy=InheritanceType.SING ...
- C#基础-事件 继承类无法直接引发基类的事件
An event can be raised only from the declaration space in which it is declared. Therefore, a class c ...
- IOS 杂笔-1(为什么不继承类簇?)
答:首先,类簇是可以继承的,并不是不可以.例如,我们可以选择继承NSSting,但是此时你用你自己设定的类去调用NSSting的一些方法时,会存在无法实现的问题,这是为什么呢. 1.类簇里有很多私有的 ...
- C++浅析——继承类内存分布和虚析构函数
继承类研究 1. Code 1.1 Cbase, CTEST为基类,CTest2为其继承类,并重新申明了基类中的同名变量 class CBase { public: int Data; CBase() ...
- 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte
#include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...
- eclipse从数据库逆向生成Hibernate实体类
做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再“自己”建立一变VO.意思是,在项目设计时,要么 ...
随机推荐
- grep 参数
功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- Spring的消息 Java Message Service (JMS)
Spring有两种方法提供对EJB的支持: Spring能让你在Spring的配置文件里,把EJB作为Bean来声明.这样,把EJB引用置入到其他Bean的属性里就成为可能了,好像EJB就是另一个P ...
- 初见Python<3>:字符串
1.格式化字符串 %s代表的是格式化字符串,或者说为字符串进行占位操作. 如果一个变量本身不是字符串,则会自动被转化为字符串. 使用%f格式化浮点数.同时也可以提供需要的精度,如%.3f,即保留3位小 ...
- 【线段树区间合并】POJ3667-Hotel
[题意] 一段区间初始均为可行.有两个操作: 1→找出长度为w的一段可行区间,如果存在则返回这个可行区间最靠左的情况,并将该区间设为不可行: 2→将区间[a,b]设为可行区间. [思路] 经典的线段树 ...
- Problem C: 程序改错(递归函数):数字转字符
Description 下面程序中“/ ***** N ***** /”的下一行中有错误,请改正(注意:不得加行.减行.加句.减句,否则后果自负). 该程序功能:用递归法将一个六位整数n转换成字符串, ...
- Problem E: 12306
#include <stdio.h> struct student{ int n; int m;}; int main(void) { int T; int k,g,i,j; ],max; ...
- office2007添加 方框并对勾选中 及约等于
看这里! http://wenku.baidu.com/view/8f2d8fbac77da26925c5b0f5.html
- POJ 2187 Beauty Contest (求最远点对,凸包+旋转卡壳)
Beauty Contest Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 24283 Accepted: 7420 D ...
- PHP版本切换
前言 php是为了快速构建一个web页面而迅速被大家广为接受的开源语言,通过不断发展已经有了很多的php开源系统,满足了目前大部分用户的站点需求.1995年初php诞生到现在已经存在多个版本,并且每个 ...
- 智普教育Python视频教程之入门基础篇,python笔记
智普教育Python视频教程之入门基础篇,python笔记 print id()内存地址 type()变量类型 windows命令行下edit命令 python数据类型不需要指定类型 定义hostna ...