基于代码复用和模型分离的思想,在项目开发中使用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使用的是多态查询,在查询父类时其所有实体子类的数据也将同时被查询出,因此查询时间和性能都将有影响。但是实体映射方式的数据库查询等同于没有实体继承关系的查询,也就是说,他仅在实体层体现出一种继承的关系却并没有在数据库中体现这样一种关系,他的操作都是独立的并且将不会影响到实体子类。
结束语:文中部分语义不清或描述含糊甚至定义错误的,请指正,期待共同进步!
分享到:
相关推荐
@MappedSuperClass:当一个类作为父类,且其属性需要被子类继承时,可以使用此注解。被此注解标注的类本身不会直接映射为数据库表,而是作为其他实体的父类。 @NoRepositoryBean:该注解用于标识不希望Spring创建...
例如,@Inheritance注解可以用来指定继承策略,@MappedSuperclass注解可以用来标识一个类为一个可被继承的实体超类。 7. 锁定策略:JPA提供锁定机制来保证数据的一致性。开发者可以使用@Version注解来为实体添加...
通过使用JPA规范的注解,开发者可以轻松地在Java应用程序中管理数据库交互,无需深入了解底层的SQL语法,同时保持代码的简洁性和可维护性。这极大地提高了开发效率,降低了学习曲线,使得开发者能更专注于业务逻辑的...
本文将详细介绍JPA框架中的常用注解及其使用方法,并结合具体的Java代码示例进行说明。 #### 二、JPA注解基础 JPA框架支持使用注解来定义实体类与数据库表之间的映射关系,极大地简化了配置工作。要使用JPA注解,...
本文将详细介绍 JPA 中的主要批注(注解),帮助开发者更好地理解和使用 JPA。 #### 实体(Entity) - **`@Entity`**:此注解用于标记 Java 类为 JPA 实体。被标注的类将成为持久化层的一部分,其实例将被存储到...
以下是对"jpa/hibernate继承注解"这一主题的详细说明。 1. **单一表继承(Single Table Inheritance, STI)** 单一表继承是最简单的继承策略,所有的子类信息都存储在一个数据库表中。使用`@Inheritance(strategy ...
#### 三、@MappedSuperclass注解的使用 `@MappedSuperclass`是一个特殊的注解,用于标记那些包含共享属性的基类,这些基类本身不是完整的实体,也不会直接映射到数据库表中。相反,它们的属性会被继承到子类中,并...
使用JPA时,可以使用批注(注解)来配置实体的JPA行为。批注是一种使用元数据修饰Java源代码的方法,它们会被添加到相应的Java类文件中,以便在运行时由JPA持久性提供程序解析以管理JPA行为。 #### 四、JPA注解详细...
- **作用**:使用 `@Configuration` 注解声明一个类为配置类,可以在这个类中使用 `@Bean` 注解定义 Bean,替代 XML 文件中的 `<bean>` 元素。 ##### 11. `@Bean` - **定义**:用于声明 Bean。 - **作用**:在 `@...
- **为何选择JPA**:解释了为什么JPA成为当前流行的Java持久化解决方案之一,包括其跨平台能力、易于使用、以及丰富的功能集等优势。 - **架构概述**:JPA提供了一套统一的API来处理不同的持久化存储层,这包括实体...
在Java中,`@MappedSuperClass`是Hibernate提供的一个注解,它用于标记那些不直接映射到数据库表,但含有可继承字段或方法的抽象类。当一个类被这个注解标识时,它的属性和方法会被其子类继承,并且这些属性和方法会...
- 实体可以继承非实体类,反之亦然,但非实体类通常使用`@MappedSuperclass`注解,表示其为其他实体类提供公共属性和行为,而不直接参与数据库存储。 - 实体类可以是抽象类,抽象实体可以作为其他实体类的基类。 - ...
- **实体**: 使用`@Entity`注解标记类为JPA实体。 - **IdClass**: 当实体的主键由多个字段组成时,可以使用`@IdClass`。 - **MappedSuperclass**: 用于共享实体类中的公共属性和行为。 - **Embeddable**: 定义嵌入式...
通常情况下,这些实体类会被 JPA 或 Hibernate 使用,并且带有 `@Entity`、`@Embeddable` 等注解。QueryDsl 的代码生成工具会扫描这些注解,然后根据实体类的结构来自动生成对应的 QModel。 ##### 2.2 方法 1. **...
- 创建实体类:每个实体类对应数据库中的一个表,使用注解@Entity定义。 - 映射文件:使用@MappedSuperclass和@Entity annotations定义实体类与数据库表的映射关系。 - Session和Transaction:通过SessionFactory...