@MappedSuperclass
将实体多个属性分别封装到不同的非实体类中,可以减少代码书写,代码复用性高。他不会映射到数据库表中,属性将映射到子类的数据库字段中。
不能再@Entity和或@Table注解,也无需implements 序列化接口。
可以使用@AttributeOverride或@AttributeOverrides 重定义其父类(无论是否是实体类)的属性,映射到数据库表中。
@AttributeOverride中的子属性@Column 可以重定义字段名或长度等属性。
标注为@MappedSuperclass的类其属性最好设置为protected或default类型的,以保证其同一个包下的子类可以直接调用它的属性。便于实体监听器或带参数构造函数的操作。
比较实体继承与实体映射的区别:
实体继承的三种策略分别是:
SINGLE_TABLE(所有继承的实体都保存在同一张数据库表中),
JOINED(每个实体子类都将保存在一个单独的表中),TABLE_PER_CLASS(有继承关系的所有实体类都将保存在单独的表中)。
实体映射最类似于JOINED实体继承方式,他也是将实体子类单独保存为一张表
但是两者最大的区别就在于:查询的时候JOINED使用的是多态查询,在查询父类时其所有实体子类的数据也将同时被查询出,因此查询时间和性能都将有影响。但是实体映射方式的数据库查询等同于没有实体继承关系的查询,也就是说,他仅在实体层体现出一种继承的关系却并没有在数据库中体现这样一种关系,他的操作都是独立的并且将不会影响到实体子类。