Spring Data JPA注解@DynamicInsert、@DynamicUpdate、@MappedSuperclass

本文详细解析了@DynamicInsert与@DynamicUpdate注解的作用,解释了它们如何在Hibernate框架中动态生成SQL语句,避免更新空字段,提高数据库操作效率。同时介绍了@MappedSuperclass注解的应用场景,用于代码复用和模型分离。

@DynamicInsert属性:设置为true,设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false。
比如希望数据库插入日期或时间戳字段时,在对象字段为空的情况下,表字段能自动填写当前的sysdate。

@DynamicUpdate属性:设置为true,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false。
比如只想更新某个属性,但是却把整个对象的属性都更新了,这并不是我们希望的结果,我们希望的结果是:我更改了哪些字段,只要更新我修改的字段就够了。

举例说明
看下面打印的sql语句就会立刻明白,使用这两个注解的效果

@DynamicInsert注解下Hibernate日志打印SQL

Hibernate: insert into Cat (cat_name, id) values (?, ?)  

反之

Hibernate: insert into Cat (create_time, update_time, cat_name, id) values (?, ?, ?, ?)  

@DynamicUpdate注解下Hibernate日志打印SQL

说明:如果字段有更新,Hibernate才会对该字段进行更新

Hibernate: update Cat set update_time=? where id=?

反之Cat实体类去掉@DynamicUpdate

说明:不管字段有没有更新,Hibernate都会对该字段进行更新

Hibernate: update Cat set update_time=?, cat_name=? where id=?  

@MappedSuperclass 这个注解表示在父类上面的,用来标识父类。

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。例如,数据库表中都需要id来表示编号,id是这些映射实体类的通用的属性,交给jpa统一生成主键id编号,那么使用一个父类来封装这些通用属性,并用@MappedSuperclas标识。

注意:

1.标注为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。

2.标注为@MappedSuperclass的类不能再标注@Entity或@Table注解,也无需实现序列化接口。

@MappedSuperclass 
public abstract class BaseEntity{ 
    @Id 
    @GeneratedValue 
    @Column(length=20)   
    public Integer getId() { 
        return this.id; 
    } 
    public void setId(Integer id) { 
        this.id = id; 
    } 
} 

 

### `@MappedSuperclass` 需要什么依赖? --- #### 一、题目重述 在编写公共实体类时,使用了 `@MappedSuperclass` 注解,那么这个注解属于哪个依赖?项目中需要引入什么依赖才能正常使用它? --- #### 二、详解 `@MappedSuperclass` 是 JPA(Java Persistence API)标准的一部分,**用于定义一个不映射到数据库表的基类**,其字段将被其子类继承并映射到各自的表中。 它通常用于抽取多个实体类中共用的字段,比如 `createTime`、`updateTime`、`id` 等。 --- ### 1. `@MappedSuperclass` 所属依赖 该注解定义在 `javax.persistence` 包中,属于 **JPA 标准的一部分**。 ```java import javax.persistence.MappedSuperclass; ``` 因此,**只要你的项目使用了 JPA(即引入了 `spring-boot-starter-data-jpa`),就可以直接使用 `@MappedSuperclass` 注解**,不需要额外添加其他依赖。 --- ### 2. 示例:使用 `@MappedSuperclass` ```java import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuperclass; import java.time.LocalDateTime; @MappedSuperclass public class BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private LocalDateTime createTime; private LocalDateTime updateTime; // Getters and Setters } ``` 子类继承该类后,字段将被映射到各自的数据表中: ```java @Entity @Table(name = "users") public class User extends BaseEntity { private String username; private String email; // Getters and Setters } ``` --- ### 3. 所需依赖(以 Maven 为例) 只需引入 `spring-boot-starter-data-jpa`,它会自动引入所有 JPA 相关注解: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 等价于引入了以下核心 JPA 包: - `javax.persistence-api`(包含 `@Entity`, `@Table`, `@MappedSuperclass` 等注解) - Hibernate Core(JPA 的实现) --- ### 4. 如果使用 Spring Boot 3.x(Jakarta EE 9+) 从 Spring Boot 3 开始,JPA 的包名从 `javax.persistence` 改为 `jakarta.persistence`: ```java import jakarta.persistence.MappedSuperclass; ``` 此时依赖为: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 仍然不需要额外引入依赖,只是包名发生了变化。 --- #### 三、知识点汇总 - **`@MappedSuperclass` 注解**:用于定义一个非实体类的基类,其字段会被子类继承并映射到数据库。 - **JPA 标准依赖**:通过引入 `spring-boot-starter-data-jpa` 自动包含 JPA 注解。 - **Spring Boot 3.x 变化**:注解包路径从 `javax.persistence` 变为 `jakarta.persistence`。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值