Hibernate JPA实体继承的映射(一) 概述
http://www.cnblogs.com/yingsong/p/5179975.html
注:文章中据说的实体指的是被@Entity注解的类。
JPA中对象关系映射通常情况下是一个实体对应一个表,两个实体之间没有任何关系。如果两个实体之间是继承关系,那么该如何映射呢?
JPA中的实体支持继承映射,多态关联,多态查询。抽象类和具体的类都可以是实体,且都可以使用@Entity来注解,映射成实体,并查询封装成一个实体。实体类可以继承非实体类,非实体类也可以继承实体类。
JPA的继承映射有如下几种情况:
一、实体类继承抽象(具体)实体类
抽象类可以指定成为一个实体,抽象实体和具体实体的唯一区别只是抽象实体不能够被直接实例化。抽象实体能够被映射成一个实体并能够作为查询目标。
抽象实体类使用@Entity注解或在XML描述符表示成一个实体。
这种映射相对复杂,后面会专门写一篇文章来举例说明。这里就不再多说。
二、实体类继承映射超类(Mapped Superclasses)
实体可以继承自一个超类,这个超类提供了持久化实体状态(即属性或字段)和映射信息,但它本身不是一个实体。通常情况下,这种超类映射的的目的是定义多个实体共有的状态和映射信息。
映射超类和实体不一样,它不能够被查询,所以不能作为参数传递给EntityManager或Query 接口进行操作。映射超类定义的持久化关系必须是单向的。
抽象类或具体的类都可以作为映射超类,使用@MappedSuperclass注解(或mapped-superclass XML描述符元素)来指定映射超类。
映射超类不会生成单独的表,它的映射信息作用于继承自它的实体类。
映射超类能够像实体类一样被映射,只是它的映射将作用于继承自它的实体类,因为它本身不存在单独的表。当作用于子类时,继承的映射信息将作用于子类对应的表上。子类可以通过@AttributeOverride和AssociationOverride注解或对应的XML描述符元素来覆盖映射超类的映射信息。下面来看一个实例:
package com.mikan; import java.io.Serializable; import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass; @MappedSuperclass
public class Employee implements Serializable { private static final long serialVersionUID = -7674269980281525370L; @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer empId; @Column
protected String name; // getter/setter方法 } package com.mikan; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table; @Entity
@Table(name = "FT_EMP")
public class FullTimeEmployee extends Employee { private static final long serialVersionUID = 9115429216382631425L; // 继承映射超类的empId和name属性 @Column
private Double salary; // getter/setter方法 } package com.mikan; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table; @Entity
@Table(name = "PT_EMP")
public class PartTimeEmployee extends Employee { private static final long serialVersionUID = -6122347374515830424L; // 继承映射超类的empId和name属性 @Column(name = "hourly_wage")
private Float hourlyWage; // getter/setter方法 }
其中Employee是映射超类,它包括两个字段(即上面所说的状态)和相应的映射信息,只是这些映射信息都由子类实体FullTimeEmployee和PartTimeEmployee继承,它本身不会生成对应的表。只会生成FT_EMP和PT_EMP两个表,这两个表中的字段包括了子类本身的字段和从映射超类中继承的字段。即FT_EMP表的字段为:empId、name、salary,而PT_EMP表的字段为:empId、name、hourly_wage。
三、实体类继承非实体类
一个实体类可以继承一个非实体超类,这个非实体超类可以是具体的类,也可以是抽象类。
这个非实体超类仅被作为一种继承行为,它的状态不会被持久化。所有继承自非实体超类的状态(即属性或字段)在实体子类中都不会被持久化,实体管理器不会管理这些状态。非实体超类上的所有注解都会被忽略。非实体超类不能作为参数传递给EntityManager或Query 接口进行操作。
下面来看一个实例:
public class Cart {
protected Integer operationCount; // transient state
public Cart() {
operationCount = 0;
}
public Integer getOperationCount() {
return operationCount;
}
public void incrementOperationCount() {
operationCount++;
}
}
@Entity
public class ShoppingCart extends Cart {
Collection<Item> items = new Vector<Item>();
public ShoppingCart() {
super();
}
@OneToMany
public Collection<Item> getItems() {
return items;
}
public void addItem(Item item) {
items.add(item);
incrementOperationCount();
}
}
ShoppingCart对应的表中不会包含operationCount字段。
Hibernate JPA实体继承的映射(一) 概述的更多相关文章
- Hibernate JPA实体继承的映射(二) @MappedSuperclass
基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中. 1.@MappedSuperclass注解只能标准在类上:@ ...
- JPA实体继承映射
注意:据说,在本文所指的实体是@Entity注解的类. JPA在对象 - 关系映射通常情况下一个实体对应表,不管是什么这两个实体之间的关系.假设两个实体之间的继承关系.那么它是如何映射? JPA实体支 ...
- JavaEE(15) - JPA实体继承
1. 实体继承映射的三种策略 #1. 整个类层次对应一张表 #2. 连接子类 #3. 每个具体类对应一张表 2. 使用抽象实体 3. 使用非实体父类 4. 重定义子类实体的外键列 ---------- ...
- JPA实体继承实体的映射策略
注:这里所说的实体指的是@Entity注解的类 继承映射使用@Inheritance来注解.它的strategy属性的取值由枚举InheritanceType来定义(包含SINGLE_TABLE.TA ...
- Spring Data JPA实体详解
1. Spring Data JPA实体概述 JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系数据库的映射,此类Java对象称为JPA实体或简称实体.实体通常与底层数据库中的单个关系 ...
- Hibernate之jpa实体映射的三种继承关系
在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class).Joined策略(table per subclass)和Table_PER_Class策略. 1.单表继承 ...
- Hibernate之实体关系映射
延迟加载与即时加载 例如Person类和Email类是一对多关系,如果设为即时加载,当加载Person时,会自动加载Email,如果设置为延迟加载,当第一次调用person.getEmails()时才 ...
- 【Hibernate 5】继承映射配置及多态查询
一.继承实现的三种策略 1.1,单表继承.每棵类继承树使用一个表(table per class hierarchy) -->本文主要介绍的继承策略 类继承树对应多个类,要把多个类的信息存放在一 ...
- Hibernate第九篇【组件映射、继承映射】
前言 到目前位置,我们已经学习了一对一.一对多.多对一.多对多映射了-既然Hibernate是ORM实现的框架,它还提供了组件映射和继承映射..本博文主要讲解组件映射和继承映射 Java主要的类主要有 ...
随机推荐
- [AlwaysOn Availability Groups]CLUSTER.LOG(AG)
CLUSTER.LOG(AG) 作为故障转移资源,在SQL Server和windows故障转移集群服务的资源DLL(hadrres.dll)之间有额外的内部交流,DLL无法被SQL Server监控 ...
- SQL2005/2008 无法连接错误
SQL2005/2008 .或者是localhost可以访问,但是127.0.0.1或者IP无法访问 打开[SQL Server 配置管理器](如果是MSSQL2005,在运行中输入SQLServer ...
- 用html5 js实现浏览器全屏
项目中需要将后台浏览器的窗口全屏,也就是我们点击一个按钮要实现按F11全屏的效果. 在HTML5中,W3C制定了关于全屏的API,就可以实现全屏幕的效果,也可以让页面中的图片,视频等全屏目前只有goo ...
- Java goto,continue,break,标签
goto:在Java中goto仍是保留字,但并未在语言中使用它:Java没有goto. 保留字的定义: 保留字(reserved word),指在高级语言中已经定义过的字,使用者不能再将这 ...
- Nginx服务安装配置
1.Nginx介绍 Nginx是一个高性能的HTTP和反向代理服务器,由俄罗斯人开发的,第一个版本发布于2004年10月4日.Nginx由于出色的性能,在世界范围内受到了越来越多人的关注,其特点是占有 ...
- 【原】iphone6来了,我该做点什么(兼容iphone6的方法)
北京时间2014年9月10日凌晨1点,苹果公司正式发布其新一代产品 iPhone6,相信做webapp开发的同学对它是充满了好奇和等待,也担心它带来各种坑爹,高清的分辨率,升级的retina显示屏,我 ...
- 【原】移动web页面兼容处理的思考
本月收到一份关爱里程碑的邮件,入职满3周年了,从一个懵懂的新人到从容淡定的小油条,在外辛苦打工不容易,能收到一封简单的关怀邮件也是有感欣慰,这里祝愿公司越发展越好. 进入主题,移动网页设计中,很多同学 ...
- <a>链接的四个伪类顺序
<a>元素的作用是可以创建一个链接,链接对应4个状态:未访问,已访问,鼠标悬停,鼠标点击瞬间. 为了给链接的4个状态应用样式,引入伪类的概念. 什么是伪类呢?简单点说,就是你没定义这个类, ...
- python3 下的文件输入输出特性以及如何覆盖文件内容和接下去输入
今天碰到了一个非常有意思的python特性.本来我是想打开一个文件,在文件的末尾接下去输入一些内容的,代码如下: f = open('test.txt', 'r+') f.write(content) ...
- 二分法&三分法
ural History Exam 二分 #include <iostream> #include <cstdlib> using namespace std; //二分 ...