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.意思是,在项目设计时,要么 ...
随机推荐
- Hive 空指针(NPE)异常
空指针NullPointerException 1 Hive之前的一些BUG [HIVE-9430] - NullPointerException on ALTER TABLE ADD PARTITI ...
- NOIP2005 day1 t1 谁拿了最多奖学金
题目描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1 ...
- [xsy3241]暴风士兵
题意:一个血量为$h$的人,它会被攻击$n$次,第$i$次有$p$的概率$-1$滴血(每次的$p$不同),问每次攻击后他的血量期望,强制在线 若一个人被扣了$i$滴血的概率为$p_i$,那么记多项式$ ...
- bzoj 1650: [Usaco2006 Dec]River Hopscotch 跳石子
1650: [Usaco2006 Dec]River Hopscotch 跳石子 Time Limit: 5 Sec Memory Limit: 64 MB Description Every ye ...
- foreach循环时动态往数组里添加数据
今天在用TP做项目的时候遇到一个问题,foreach的时候需要动态往数组里添加数据,示例代码如下: $arr = array( array('id'=>'字符串1','name'=>'字符 ...
- 【荐】利用NAT、Host-Only双虚拟网卡,实现Virtual Box中CentOS5.x联网
一.虚拟机与主机互联,通常有三种方式,详细介绍请看: VMware虚拟机三种网络模式(Bridged,Nat,Host-only)区别详解 二.通过网络共享,Host-Only联网,详细案例请看: W ...
- mysql 按年月查询
查询2017的数据:select * from table where year(column)='2017';查找月份为12的数据:select * from table where month(c ...
- Virtualbox+ubuntu设置共享文件夹
转:http://www.juwends.com/tech/unix_series/virtualbox-ubuntu-sharefolder.html 1. 进入系统,安装增强功能,安装完关闭系统. ...
- 【mybatis】mybatis多表联查,存在一对多关系的,实体中使用List作为字段接收查询结果的写法
实体如下: IntegralGoods 积分商品 IntegralGoodsImg 积分商品图片 ShelfLog 积分商品自动上架记录 IntegralGoods :IntegralGoodsIm ...
- 十一.spring-boot 添加http自动转向https
SSL是为网络通信提供安全以及保证数据完整性的的一种安全协议,SSL在网络传输层对网络连接进行加密. 例:cas 的单点登陆就用到了SSL 一.安全证书的生成 1.可以使用jdk自带的证书生成工具,j ...