注意:据说,在本文所指的实体是@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现场。

版权声明:本文博主原创文章。博客,未经同意不得转载。

JPA实体继承映射的更多相关文章

  1. Hibernate JPA实体继承的映射(一) 概述

    http://www.cnblogs.com/yingsong/p/5179975.html   注:文章中据说的实体指的是被@Entity注解的类. JPA中对象关系映射通常情况下是一个实体对应一个 ...

  2. JavaEE(15) - JPA实体继承

    1. 实体继承映射的三种策略 #1. 整个类层次对应一张表 #2. 连接子类 #3. 每个具体类对应一张表 2. 使用抽象实体 3. 使用非实体父类 4. 重定义子类实体的外键列 ---------- ...

  3. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  4. JPA实体继承实体的映射策略

    注:这里所说的实体指的是@Entity注解的类 继承映射使用@Inheritance来注解.它的strategy属性的取值由枚举InheritanceType来定义(包含SINGLE_TABLE.TA ...

  5. Hibernate JPA实体继承的映射(二) @MappedSuperclass

    基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中. 1.@MappedSuperclass注解只能标准在类上:@ ...

  6. Spring Data JPA实体详解

    1. Spring Data JPA实体概述 JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系数据库的映射,此类Java对象称为JPA实体或简称实体.实体通常与底层数据库中的单个关系 ...

  7. Hibernate之jpa实体映射的三种继承关系

    在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class).Joined策略(table per subclass)和Table_PER_Class策略. 1.单表继承 ...

  8. JPA中建立数据库表和实体间映射小结

    在JPA中,映射数据库表和实体的时候,需要注意一些细节如下, 实体类要用@Entity的注解: 要用 @Id 来注解一个主键: 如果跟数据库相关联,要用@Table注解相关数据库表: 实体类中字段需要 ...

  9. JPA总结——实体关系映射(一对多@OneToMany)

    JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...

随机推荐

  1. 数据库的group by 分组

    有一个表 查询结果为 用下面的代码写 select COUNT( case NumName when 'a' then NumName end ) as 'aaa', COUNT( case NumN ...

  2. 飘逸的python - 保持命名空间的整洁

    API的设计是一个艺术活.往往需要其简单.易懂.整洁.不累赘. 很多时候,我们在底层封装一个方法给高层用,而其它的方法只是为了辅助这个方法的. 也就是说我们只需要暴露这个方法就行,不用关心这个方法是怎 ...

  3. hdu 1394 Minimum Inversion Number(线段树之 单点更新求逆序数)

    Minimum Inversion Number                                                                           T ...

  4. SQL Server :理解GAM和SGAM页

    原文:SQL Server :理解GAM和SGAM页 我们知道SQL Server在8K 的页里存储数据.分区就是物理上连续的8个页.当我们创建一个数据库,数据文件会被逻辑分为页和区,当用户对象创建时 ...

  5. 悼念传奇,约翰询问&#183;纳什和他的妻子艾丽西亚致敬,创建一个传奇,爱数学

    约翰·阅读·纳什的传记.我渴望录制通道 我一直相信数字,无论逻辑方程使我们认为.但这种追求一生的后,我问自己:"这是什么逻辑?谁决定的理由?"我的探索让我从物理到形而上,最后到了妄 ...

  6. HDU 4883 Best Coder Round 2 TIANKENG’s restaurant 解读

    有一组数据是在客人到达和出发时间,问:多少把椅子的能力,以满足所有客人的需求,可以有一个地方坐下要求. 有些人甚至开始考虑暴力法,这些数据是少,其实这个问题很多数据, 暴力需求O(n*n)的时间效率, ...

  7. java编程规范之java命名规范

    想要成为一个优秀的程序员,首先要培养良好的编程习惯,为了提高代码的可读性,必须有好的命名规范. 这篇文章是小编结合网上的很多资料整理出来的,若有不当或错误的地方,欢迎大家指正 在文章开始前,为方便阅读 ...

  8. [Unity3D]脚本中Start()和Awake()的差别

    Unity3D刚開始学习的人常常把Awake和Start混淆. 简单说明一下,Awake在MonoBehavior创建后就立马调用,Start将在MonoBehavior创建后在该帧Update之前. ...

  9. MATLAB描绘极坐标图像——polar

    polar可用于描绘极坐标图像. 最简单而经常使用的命令格式:POLAR(THETA, RHO)  当中,THETA是用弧度制表示的角度,RHO是相应的半径. 例: a=-2*pi:.001:2*pi ...

  10. 座IO理解力

    一般堵塞IO服务器通信,通常有一个单独的Acceptor线程负责监控client联系,它接收client对于每个请求连接后client分配用于处理一个新的线程,处理后.返回应答给client.线程才销 ...