基于代码复用和模型分离的思想,[email protected]的多个属性分别封装到不同的非实体类中。

  1. @MappedSuperclass注解只能标准在类上:@Target({java.lang.annotation.ElementType.TYPE})

  2. [email protected],他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。

  3. [email protected]@[email protected],也无需实现序列化接口。

    [email protected][email protected]的类的话,[email protected]@AttributeOverrides注解重定义其父类(无论是否是实体类)的属性映射到数据库表中的字段。

    比如可以重定义字段名或长度等属性,[email protected]@Column进行具体的定义。

    注意[email protected][email protected]@Column设置都将不起作用。

    [email protected]@Column注解,但是在实际使用中Hibernate JPA不支持这中标注方式。

  4. 此外,[email protected],他的作用范围仅在其所有继承类中,并且实体监听器同样可以保被其子类继承或重载。

  5. [email protected]或default类型的,以保证其同一个包下的子类可以直接调用它的属性。便于实体监听器或带参数构造函数的操作。

  6. [email protected]体类,[email protected][email protected],这一点以及对属性类型重载([email protected])的支持JPA规范还有待改进。

  7. [email protected][email protected]是在实体继承的时候使用的较多,但是在实体映射的时候可以不用设置。

  8. 比较实体继承与实体映射的区别:

实体继承的三种策略分别是:SINGLE_TABLE(所有继承的实体都保存在同一张数据库表中),JOINED(每个实体子类都将保存在一个单独的表中),TABLE_PER_CLASS(有继承关系的所有实体类都将保存在单独的表中)。

实体映射最类似于JOINED实体继承方式,他也是将实体子类单独保存为一张表,但是两者最大的区别就在于:查询的时候JOINED使用的是多态查询,在查询父类时其所有实体子类的数据也将同时被查询出,因此查询时间和性能都将有影响。但是实体映射方式的数据库查询等同于没有实体继承关系的查询,也就是说,他仅在实体层体现出一种继承的关系却并没有在数据库中体现这样一种关系,他的操作都是独立的并且将不会影响到实体子类。