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.意思是,在项目设计时,要么 ...
随机推荐
- Linux基础系列-Day8
Shell编程基础 Shell介绍 Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于windows下的的cmd.exe.它接收用户命令,然后调用相应的应用程序 ...
- js中ajax的异步性
最近项目里遇到ajax异步性的问题,简化后的代码如下: function ajaxGetEvents(calendarView, time) { var year = time.getFullYear ...
- Socket读取页面
http://www.knowsky.com/363189.html http://hi.baidu.com/myyers/item/f90fa3f57d89e1d243c36a34 http://h ...
- 【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors
d(x)表示x的约数个数,让你求(l,r<=10^12,r-l<=10^6,k<=10^7) #include<cstdio> using namespace std; ...
- xml和集合混合使用-图书管理器
package com.book; public class Book { private int id; //图书编号 private String name; //图书名称 private Str ...
- mysql启动错误解决
mysql 启动时,报错一般都不明显,因此我们需要配置错误日志 #vim /etc/my.cnf xxxxxxxxxx 1 1 #vim /etc/my.cnf 在[mysqld]下添加 log_ ...
- 班尼特·A·麦克道尔 - 一个交易者的资金管理系统(2013年5月26日)
<一个交易者的资金管理系统:如何确保利润并避免破产风险> 作 者:班尼特·A·麦克道尔 系 列:“引领时代”金融投资系列-世界交易经典译丛 出 版:万卷出版公司 字 数:155千字 阅读完 ...
- WiFi安全测试工具、蹭网利器–WiFiPhisher(转)
读后感:看了一下官方介绍,需要2张无线网卡的支持,其中一张应该是用来影响用户和正常热点的连接,即进行dos攻击,而另外一张可以模拟一个假AP等待用户接入,这种攻击将对物联网和智能家居安防等产品造成很大 ...
- mysql语句总结
mysql语句总结 -- 1,通过windows提供的服务管理来完成 -- services.msc -- 2,dos下的命令来完成 -- 停止 -- net stop mysql -- 启动 -- ...
- Nokitjs 系列-01 - HelloWorld
一.前言 本篇文章需要读者有一点 Node.js 基础的了解,并且已经安装了 Node.js (node.npm),但并不需要有 Nokit 的知识,本文将简单介绍 Nokitjs 的安装使用,并编写 ...