Spring Data JPA 使用

Spring Data JPA 常用注解

  1. @Entity

    标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表

  2. @Table

    设置实体类在数据库所对应的表名

    1
    2
    3
    4
    5
    @Entity
    @Table(name = "t_user")
    public class User implements java.io.Serializable {
    private static final long serialVersionUID = 4579521515899728869L;
    }
  1. @Id

    标识类里所在变量为主键

  2. @GeneratedValue

    设置主键生成策略,此方式依赖于具体的数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 使用序列
    @Id
    @SequenceGenerator(name = "sq_name", sequenceName = "SQ_USER", allocationSize = 1)
    @GeneratedValue(generator = "sq_name", strategy = GenerationType.SEQUENCE)
    private Long id;

    // 使用分布式 Id 生成
    /**
    * 唯一主键:GenericGenerator 注解的 strategy 属性,使用非默认策略的时候,需要使用全类名
    */
    @Id
    @GenericGenerator(
    name = "SnowflakeId_BaseEntityId",
    // 这里需要使用全限类名
    strategy = "top.ylonline.hibernate.id.SnowflakeIdentifierGenerator"
    )
    @GeneratedValue(generator = "SnowflakeId_BaseEntityId")
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;
  1. @Column表示属性所对应字段名进行个性化设置

  2. @Transient表示属性并非数据库表字段的映射,ORM框架将忽略该属性

    1
    2
    @Transient
    private String zq;
  1. @Temporal

    当我们使用到java.util包中的时间日期类型时,需要此注释来说明转化成java.util包中的类型。

    注入数据库的类型有三种:

    TemporalType.DATE(yyyy-MM-dd)

    TemporalType.TIME(HH:mm:ss)

    TemporalType.TIMESTAMP(yyyy-MM-dd HH:mm:ss.SSS)

    1
    2
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdAt;
  1. @Enumerated

    使用此注解映射枚举字段,以String类型存入数据库

    注入数据库的类型有两种:

    EnumType.ORDINAL(Interger)

    EnumType.STRING(String)

  2. @Embedded、@Embeddable

    当一个实体类要在多个不同的实体类中进行使用,而其不需要生成数据库表

    @Embeddable:注解在类上,表示此类是可以被其他类嵌套

    @Embedded:注解在属性上,表示嵌套被@Embeddable注解的同类型类

  3. @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy

    分别表示创建时间(insert)、创建用户(insert)、最后修改时间(update)、最后修改用户(update)

    用法:

    1、@EntityListeners(AuditingEntityListener.class):申明实体类并加注解

    2 、实现AuditorAware类

    3、springboot 启动类加上注解@EnableJpaAuditing

    4、在实体类中属性中加上面四种注解

  4. @MappedSuperclass

    实现将实体类的多个属性分别封装到不同的非实体类中

    注解的类不是完整的实体类,不会映射到数据库表,但其属性将映射到子类的数据库字段

    注解的类不能再标注@Entity@Table注解,也无需实现序列化接口

Page

函数 描述 备注
getTotalElements 总记录数
getTotalPages 总页数
getContent 查询记录列表
getNumber 当前页数,从0开始
getNumberOfElements 当前页码中的记录数
getSize 每页记录数

EntityListeners注解

使用在实体类,或者mapped superclass上

主要是配置PrePersistPreRemovePostPersistPostRemovePreUpdatePostUpdatePostLoad等监听回调

配置JPA审计使用

1
2
3
4
注意:如果需要自动填充createdBy、createdAt、modifiedBy、modifiedAt
1、需要开启JPA审计(启用@EnableJpaAuditing)
2、新建一个类实现AuditorAware接口,返回createdBy、modifiedBy的值,然后通过@Configuration注册成bean
3、在实体类,或者mapped superclass上@EntityListeners(org.springframework.data.jpa.domain.support.AuditingEntityListener.class)

Modifying注解

(1)可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作。 注意: JPQL 不支持使用 INSERT

(2)在 @Query 注解中编写 JPQL 语句, 但必须使用 @Modifying 进行修饰. 以通知 Spring Data, 这是一个 UPDATE 或 DELETE 操作

(3)UPDATE 或 DELETE 操作需要使用事务,此时需要定义 Service 层,在 Service 层的方法上添加事务操作

(4)默认情况下, Spring Data 的每个方法上有事务, 但都是一个只读事务。 他们不能完成修改操作

批量插入、更新配置

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
jpa:
# show-sql: true
database: ORACLE
properties:
hibernate:
# format_sql: false
dialect: org.hibernate.dialect.Oracle10gDialect
jdbc:
batch_size: 500
batch_versioned_data: true
order_inserts: true
order_updates: true

参考

https://vladmihalcea.com/how-to-batch-insert-and-update-statements-with-hibernate/

https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch03.html#configuration-jdbc-properties

  • 本文作者: forever杨
  • 本文链接: https://blog.yl-online.top/posts/6cc2492a.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。如果文章内容对你有用,请记录到你的笔记中。本博客站点随时会停止服务,请不要收藏、转载!