@MappedSuperclass注解的使用说明
转载自:http://blog.sina.com.cn/s/blog_7085382f0100uk4p.html
基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。
1.@MappedSuperclass注解只能标准在类上:@Target({java.lang.annotation.ElementType.TYPE})
2.标注为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。
3.标注为@MappedSuperclass的类不能再标注@Entity或@Table注解,也无需实现序列化接口。
但是如果一个标注为@MappedSuperclass的类继承了另外一个实体类或者另外一个同样标注了@MappedSuperclass的类的话,他将可以使用@AttributeOverride或@AttributeOverrides注解重定义其父类(无论是否是实体类)的属性映射到数据库表中的字段。
比如可以重定义字段名或长度等属性,使用@AttributeOverride中的子属性@Column进行具体的定义。
注意:对于其父类中标注@Lob注解的属性将不能重载,并且@AttributeOverride里的@Column设置都将不起作用。
JPA规范中对@Lob注解并没有说明不能同时标注@Column注解,但是在实际使用中Hibernate JPA不支持这中标注方式。
4.此外,这样的类还可以直接标注@EntityListeners实体监听器,他的作用范围仅在其所有继承类中,并且实体监听器同样可以保被其子类继承或重载。
5.标注为@MappedSuperclass的类其属性最好设置为protected或default类型的,以保证其同一个包下的子类可以直接调用它的属性。便于实体监听器或带参数构造函数的操作。
6.由于标注为@MappedSuperclass的类将不是一个完整的实体类,因此其不能标注@Table,并且无法使用@UniqueConstraint设置字段的Unique属性,这一点以及对属性类型重载(如重载标注为@Lob的属性)的支持JPA规范还有待改进。
7.可以同时标注@DiscriminatorValue注解,以设定实体子类的实体标识字段的值。该属性一般是在实体继承的时候使用的较多,但是在实体映射的时候可以不用设置。
8.比较实体继承与实体映射的区别:
实体继承的三种策略分别是:SINGLE_TABLE(所有继承的实体都保存在同一张数据库表中),JOINED(每个实体子类都将保存在一个单独的表中),TABLE_PER_CLASS(有继承关系的所有实体类都将保存在单独的表中)。
实体映射最类似于JOINED实体继承方式,他也是将实体子类单独保存为一张表,但是两者最大的区别就在于:查询的时候JOINED使用的是多态查询,在查询父类时其所有实体子类的数据也将同时被查询出,因此查询时间和性能都将有影响。但是实体映射方式的数据库查询等同于没有实体继承关系的查询,也就是说,他仅在实体层体现出一种继承的关系却并没有在数据库中体现这样一种关系,他的操作都是独立的并且将不会影响到实体子类。
Hibernate之jpa实体映射的三种继承关系
转载自:http://www.cnblogs.com/shangxiaofei/p/5704321.html
在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class)、Joined策略(table per subclass)和Table_PER_Class策略。
1.单表继承策略
单表继承策略,父类实体和子类实体共用一张数据库表,在表中通过一列辨别字段来区别不同类别的实体。具体做法如下:
a.在父类实体的@Entity注解下添加如下的注解:
@Inheritance(Strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=”辨别字段列名”)
@DiscriminatorValue(父类实体辨别字段列值)
b.在子类实体的@Entity注解下添加如下的注解:
@DiscriminatorValue(子类实体辨别字段列值)
定义了一个父类
- @Entity
- @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
- @Table(name = "WINDOW_FILE")
- @DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING, length = 30)
- @DiscriminatorValue("WindowFile")
- public class WindowFile {
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private Integer id;
- @Basic
- @Column(name = "NAME")
- private String name;
- @Basic
- @Column(name = "TYPE")
- private String type;
- @Basic
- @Column(name = "DATE")
- private Date date;
- //省略get set
- }
后定义2个子类
- @Entity
- @DiscriminatorValue("Folder")
- public class Folder extends WindowFile {
- @Basic
- @Column(name = "FILE_COUNT")
- private Integer fileCount;
- //省略get set
- }
- @Entity
- @DiscriminatorValue("Document")
- public class Document extends WindowFile {
- @Basic
- @Column(name = "SIZE")
- private String size;
- //省略get set
- }
以上通过列DISCRIMINATOR的不同,区分具体父子实体。
实际表结构如下:
WINDOW_FILE DISCRIMINATOR,ID,NAME,DATE,TYPE,SIZE,FILE_COUNT
当你使用WindowFile实体时,实际表的字段为DISCRIMINATOR='WindowFile',SIZE与FILE_COUNT永远是空
当使用Folder实体时,DISCRIMINATOR='Folder',SIZE永远是空,FILE_COUNT为实际值。
Document同理,与Folder类似。
2.Joined策略
父类实体和子类实体分别对应数据库中不同的表,子类实体的表中只存在其扩展的特殊属性,父类的公共属性保存在父类实体映射表中。具体做法:
@Inheritance(Strategy=InheritanceType.JOINED)
子类实体不需要特殊说明。
- @Entity
- @Table(name = "T_ANIMAL")
- @Inheritance(strategy = InheritanceType.JOINED)
- public class Animal {
- @Id
- @Column(name = "ID")
- @GeneratedValue(strategy = GenerationType.AUTO)
- private Integer id;
- @Column(name = "NAME")
- private String name;
- @Column(name = "COLOR")
- private String color;
- //省略get set
- }
- @Entity
- @Table(name = "T_BIRD")
- @PrimaryKeyJoinColumn(name = "BIRD_ID")
- public class Bird extends Animal {
- @Column(name = "SPEED")
- private String speed;
- //省略get set
- }
- @Entity
- @Table(name = "T_DOG")
- @PrimaryKeyJoinColumn(name = "DOG_ID")
- public class Dog extends Animal {
- @Column(name = "LEGS")
- private Integer legs;
- //省略get set
- }
实际表结构如下:
T_ANIMAL ID,COLOR,NAME
T_BIRD SPEED,BIRD(既是外键,也是主键)
T_DOG LEGS,DOG_ID(既是外键,也是主键)
3.Table_PER_Class策略:
Table_PER_Class策略,父类实体和子类实体每个类分别对应一张数据库中的表,子类表中保存所有属性,包括从父类实体中继承的属性。具体做法:
只需在父类实体的@Entity注解下添加如下注解:
@Inheritance(Strategy=InheritanceType.TABLE_PER_CLASS)
- @Entity
- @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
- @Table(name = "T_VEHICLE")
- public class Vehicle { // 基类
- @Id
- // @GeneratedValue
- @Column(name = "ID")
- private Integer id;
- @Column(name = "SPEED")
- private Integer speed;// 速度
- //省略get set
- }
- @Entity
- @Table(name = "T_CAR")
- public class Car extends Vehicle {
- @Column(name = "ENGINE")
- private String engine;// 发动机
- //省略get set
- }
一旦使用这种策略就意味着你不能使用AUTO generator 和IDENTITY generator,即主键值不能采用数据库自动生成。
实际表结构如下:
T_VEHICLE ID,SPEED
T_CAR ID,SPEED,ENGINE
@MappedSuperclass注解的使用说明的更多相关文章
- JPA @MappedSuperclass注解的使用说明
基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中. 1.@MappedSuperclass注解只能标准在类上:@ ...
- JPA @MappedSuperclass注解的使用说明(转)
(2011-11-07 11:37:30) 转载▼ http://blog.sina.com.cn/s/blog_7085382f0100uk4p.html 标签: 杂谈 基于代码复用和模型分离的 ...
- 二十、springboot之jpa开发@MappedSuperclass 注解说明
@MappedSuperclass使用条件: 当我们进行开发项目时,我们经常会用到实体映射到数据库表的操作,此时我们经常会发现在我们需要映射的几个实体类中,有几个共同的属性,例如编号ID,创建者,创建 ...
- JPA @MappedSuperclass注解
该注解只能引用于类上,使用该注解的类将不是一个完整的类,不会映射到数据库的表中,但是该类的属性会映射到其子类的数据库字段中 @MappedSuperclass注解使用在父类上面,是用来标识父类的作用 ...
- Jpa实体VO使用继承的实体的做法@MappedSuperclass注解的使用
在我们开发一个项目的时候,同城定义实体的时候,都会进行一些抽象,也就是面向对象的一些思想.1比如无论是数据实体还是其他类型的实体都会有id字段2.对于数据实体一般都会有创建人,创建时间,更新人,更新时 ...
- springmvc 中常用的注解配置使用说明
很久没有用springmvc了,今天复习了一下,然后记录一下总结. @Controller 使用 @Controller 注释对将成为 MVC 中控制器的类进行注释并处理 HTTP 请求. @ ...
- 【JPA】JPA的注解@MappedSuperclass作用解释【转】
[代码参考地址]:GitHub地址 [原文地址][http://blog.sina.com.cn/s/blog_7085382f0100uk4p.html] [这里仅用到第三点为止] ======== ...
- hibernate注解(转)
一.实体Bean 每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用 @Entity 注解来进行声明. 声明实体Bean @Entity public class Flight impl ...
- SpringBoot注解大全 转
2019年3月17日22:30:10 一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@Enab ...
随机推荐
- GBDT算法原理深入解析
GBDT算法原理深入解析 标签: 机器学习 集成学习 GBM GBDT XGBoost 梯度提升(Gradient boosting)是一种用于回归.分类和排序任务的机器学习技术,属于Boosting ...
- shared_ptr 线程安全
Then what's really happening is TWO different sections of memory are being allocated. It's done at o ...
- Linux 目录配置
一.Linux 目录配置标准:FHS FHS(Filessystem Hierarchy Standard) 的重点在于规范每个特定的目录下应该要放置什么样子的数据. FHS依据文件系统使用的频繁与否 ...
- js产生随机数函数
函数: //产生随机数函数 function RndNum(n){ var rnd=""; for(var i=0;i<n;i++) rnd+=Math.floor(Math ...
- stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)
I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...
- spring中订阅redis键值过期消息通知
1.首先启用redis通知功能(ubuntu下操作):编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知): notify-keyspace-events Ex 或者登陆 ...
- tony_iptables_01_linux下IPTABLES配置详解(转)
如果你的IPTABLES基础知识还不了解,建议先去看看. 开始配置 我们来配置一个filter表的防火墙. (1)查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables - ...
- NPOI Excel 单元格背景颜色对照表
NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...
- Redis(一) 介绍
先说明下,本人是在windows系统下用的. 简单介绍一下,是nosql数据库,采用key-value存储方式形式.可用于处理高并发日志.维护top表等. 如果把它完全当初数据库使用,当做小型数据库还 ...
- xcode 插件地址
http://finalshares.com/read-1104 curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/de ...