Spring Data JPA注解@DynamicInsert、@DynamicUpdate、@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; 
    } 
} 

 

<think>嗯,用户想了解Java中@CreatedBy注解Spring Data JPA中的自动填充机制。首先,我需要回忆一下相关的知识点。记得@CreatedBy和类似的注解如@CreatedDate、@LastModifiedBy等是用来自动填充实体类的审计字段的。这些注解通常和JPA的审计功能一起使用,可能需要结合@EntityListeners和@EnableJpaAuditing来启用。 根据用户提供的引用内容,特别是引用[3]和引用[5],可以看到需要几个关键步骤。首先,实体类需要添加@EntityListeners(AuditingEntityListener.class)来启用审计监听。然后,在启动类上加上@EnableJpaAuditing开启整个应用的审计功能。此外,用户提到的公共类可能需要使用@MappedSuperclass注解,这样父类的字段才能被继承到子类的数据库表中,否则审计字段可能无法正确填充。 另外,@CreatedBy需要配合AuditorAware接口的实现类,这个实现类负责提供当前用户的信息。例如,在Spring Security环境中,可以通过SecurityContextHolder获取当前用户的用户名或ID,然后返回给AuditorAware,这样@CreatedBy就能自动填充这个值。引用[5]中的代码示例展示了如何实现AuditorAware,返回用户ID。 还要注意,如果实体类继承自一个父类,而这个父类包含审计字段,那么父类必须标注@MappedSuperclass,否则JPA可能不会处理这些字段,导致自动填充失效,如引用[3]所述的问题。此外,字段的类型需要正确,比如@CreatedBy通常用于String类型的用户标识,而@CreatedDate用于日期类型,可能需要使用@Temporal(TemporalType.TIMESTAMP)来指定日期格式。 用户可能遇到的问题包括未启用审计功能、未正确实现AuditorAware、或者父类没有正确使用@MappedSuperclass。需要检查这些配置是否正确,同时确保实体类正确继承了审计字段。 总结一下,回答的结构应该是先说明基本机制,然后分步骤讲解配置方法,接着说明如何获取用户信息,最后列举常见问题和解决方法。同时,引用相关的引用内容来支持每个步骤,确保回答的准确性。</think>### Java中@CreatedBy注解的自动填充机制详解 在Spring Data JPA中,`@CreatedBy` 是用于自动填充实体类审计字段(如创建者、修改者)的核心注解。其实现依赖于 **审计功能(Auditing)** 和 **用户信息注入机制**,以下是具体实现步骤与原理: --- #### 一、核心配置步骤 1. **启用JPA审计功能** 在Spring Boot启动类添加 `@EnableJpaAuditing` 注解,激活审计功能: ```java @SpringBootApplication @EnableJpaAuditing public class Application { ... } ``` 2. **实体类添加审计监听** 在实体类或公共基类上添加 `@EntityListeners(AuditingEntityListener.class)`,使JPA监听实体生命周期事件: ```java @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class BaseEntity { @CreatedBy private String createdBy; @LastModifiedBy private String modifiedBy; } ``` - `@MappedSuperclass` 确保基类字段映射到子类数据库表[^3]。 3. **实现用户信息注入** 自定义 `AuditorAware` 接口实现类,定义当前用户信息的获取逻辑: ```java @Component public class SpringSecurityAuditorAware implements AuditorAware<String> { @Override public Optional<String> getCurrentAuditor() { // 示例:从Spring Security中获取用户名 return Optional.ofNullable(SecurityContextHolder.getContext()) .map(SecurityContext::getAuthentication) .map(Authentication::getName); } } ``` - 此逻辑会为 `@CreatedBy` 和 `@LastModifiedBy` 提供值[^5]。 --- #### 二、注解作用范围与类型 - **适用字段类型** `@CreatedBy` 通常用于 `String` 类型字段,但也可支持自定义类型(如用户ID对象)。 - **触发时机** - `@CreatedBy`:仅在实体首次保存时填充。 - `@LastModifiedBy`:在实体插入和更新时均填充。 --- #### 三、常见问题与解决 1. **字段未自动填充** - 检查是否漏加 `@EnableJpaAuditing` 或 `@EntityListeners`。 - 确认基类是否标注 `@MappedSuperclass`。 2. **获取用户信息失败** - 确保 `AuditorAware` 实现类被Spring管理(如添加 `@Component`)。 - 在非Web请求线程中(如异步任务),需手动传递用户上下文。 3. **与时间注解结合使用** 若需同时填充时间字段,可添加 `@CreatedDate` 和 `@LastModifiedDate`: ```java @CreatedDate @Temporal(TemporalType.TIMESTAMP) private Date createTime; ``` --- #### 四、扩展应用 - **自定义ID生成策略** 若需使用雪花算法生成ID,可结合 `@GenericGenerator` 和 `@CreatedDate` 实现[^2]。 - **多租户场景** 通过重写 `AuditorAware`,可注入租户ID或其他业务上下文信息。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值