基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。
1.@MappedSuperclass注解仅仅能标准在类上:@Target({java.lang.annotation.ElementType.TYPE})
2.标注为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,可是他的属性都将映射到其子类的数据库字段中。
3.标注为@MappedSuperclass的类不能再标注@Entity或@Table注解,也无需实现序列化接口。
注意:对于其父类中标注@Lob注解的属性将不能重载,而且@AttributeOverride里的@Column设置都将不起作用。
JPA规范中对@Lob注解并没有说明不能同一时候标注@Column注解。可是在实际使用中Hibernate JPA不支持这中标注方式。
4.此外,这种类还能够直接标注@EntityListeners实体监听器,他的作用范围仅在其全部继承类中。而且实体监听器相同能够保被其子类继承或重载。
5.标注为@MappedSuperclass的类其属性最好设置为protected或default类型的,以保证其同一个包下的子类能够直接调用它的属性。便于实体监听器或带參数构造函数的操作。
6.因为标注为@MappedSuperclass的类将不是一个完整的实体类,因此其不能标注@Table,而且无法使用@UniqueConstraint设置字段的Unique属性,这一点以及对属性类型重载(如重载标注为@Lob的属性)的支持JPA规范还有待改进。
1.@MappedSuperclass注解仅仅能标准在类上:@Target({java.lang.annotation.ElementType.TYPE})
2.标注为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,可是他的属性都将映射到其子类的数据库字段中。
3.标注为@MappedSuperclass的类不能再标注@Entity或@Table注解,也无需实现序列化接口。
可是假设一个标注为@MappedSuperclass的类继承了另外一个实体类或者另外一个相同标注了@MappedSuperclass的类的话。他将能够使用@AttributeOverride或@AttributeOverrides注解重定义其父类(不管是否是实体类)的属性映射到数据库表中的字段。
注意:对于其父类中标注@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使用的是多态查询。在查询父类时其全部实体子类的数据也将同一时候被查询出。因此查询时间和性能都将有影响。可是实体映射方式的数据库查询等同于没有实体继承关系的查询。也就是说,他仅在实体层体现出一种继承的关系却并没有在数据库中体现这样一种关系,他的操作都是独立的而且将不会影响到实体子类。
来源:https://www.cnblogs.com/wgwyanfs/p/7100556.html