Spring Data JPA - Reference Documentation
1. 引入配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
spring:
datasource:
username: root
password: root
url: jdbc:mysql://12.8.14.189:3306/study?useUnicode=true&characterEncoding=utf8
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
database: mysql
database-platform: org.hibernate.dialect.MySQL8Dialect
hibernate:
# 禁用 hibernate 的表结构自动更新
ddl-auto: none
properties:
hibernate:
connection:
provider_disables_autocommit: true
generate_statistics: false
id:
new_generator_mappings: true
jdbc:
batch_size: 25
order_inserts: true
order_updates: true
query:
fail_on_pagination_over_collection_fetch: true
in_clause_parameter_padding: true
show-sql: true
2. 实体类注解
@Entity
@Table(name="cst_customer")
主键
UUID
IDENTITY
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="cust_id")
private Long custId;
AUTO
TABLE
使用一个特定的数据库表格来保存主键
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator="payablemoney_gen")
@TableGenerator(name = "pk_gen",
table="tb_generator",
pkColumnName="gen_name",
valueColumnName="gen_value",
pkColumnValue="PAYABLEMOENY_PK",
allocationSize=1
)
private Long custId;
//@TableGenerator的定义:
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface TableGenerator {
//表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中
String name();
//表示表生成策略所持久化的表名,例如,这里表使用的是数据库中的“tb_generator”。
String table() default "";
//catalog和schema具体指定表所在的目录名或是数据库名
String catalog() default "";
String schema() default "";
//属性的值表示在持久化表中,该主键生成策略所对应键值的名称。例如在“tb_generator”中将“gen_name”作为主键的键值
String pkColumnName() default "";
//属性的值表示在持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加。例如,在“tb_generator”中将“gen_value”作为主键的值
String valueColumnName() default "";
//属性的值表示在持久化表中,该生成策略所对应的主键。例如在“tb_generator”表中,将“gen_name”的值为“CUSTOMER_PK”。
String pkColumnValue() default "";
//表示主键初识值,默认为0。
int initialValue() default 0;
//表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。
int allocationSize() default 50;
UniqueConstraint[] uniqueConstraints() default {};
}
//这里应用表tb_generator,定义为 :
CREATE TABLE tb_generator (
id NUMBER NOT NULL,
gen_name VARCHAR2(255) NOT NULL,
gen_value NUMBER NOT NULL,
PRIMARY KEY(id)
)
@SQLDelete
当执行删除语句的时候
@SQLDelete(sql = "Update Cluster set IsDeleted = 1, DeletedAt = ROUND(UNIX_TIMESTAMP(NOW(4))*1000) where Id = ?")
public class Cluster extends BaseEntity implements Comparable<Cluster> {}
@Where
当执行查询
@Where(clause = "isDeleted = 0")
public class Cluster extends BaseEntity implements Comparable<Cluster> {}
@Temporal
日期类型映射
@Temporal(TemporalType.DATE)
private Date date;
从 Java 8 开始,引入了新的日期和时间 API (java.time.*),它比旧的 java.util.Date 更加现代和强大。因此,如果你正在开发新项目,建议使用 LocalDate, LocalTime, LocalDateTime, ZonedDateTime 等类,而 JPA 也支持直接映射这些类到数据库中的日期和时间字段,无需使用 @Temporal 注解。
Transient
指定不参与映射
@Basic @Lob
@Lob @Basic(fetch=FetchType.LAZY)
@Column(name="blobtest")
private String blobtest;
Column
- name
- unique
- nullable
- int length() default 255;
- insertable
- updatable
- table
- String columnDefinition() default "";
@Column(name="cust_name",columnDefinition = "varchar(32) NOT NULL")
numeric
@Column(precision = 5, scale = 2)
private double assets;
`assets` double(5,2) DEFAULT NULL,