[关闭]
@zhuanxu 2017-12-27T17:39:01.000000Z 字数 3229 阅读 5169

spring data jpa 系列教程三:定义实体类

spring-data-jpa-系列教程


前面第一篇介绍了常见orm框架,第二篇介绍了spring-jpa概念和配置,本文会介绍具体jpa的使用。

定义实体类

我们先定义实体类 Customer

Customer 类添加的@Entity标注表明 Customer 对象将会成为被 JPA 管理的实体;id属性上的@Id和@GeneratedValue(strategy=GenerationType.AUTO)标注表明id是一个自增的主键。

通过定义的实体,jpa就能够自动生成创建 Schema 的 DDL,它们将会在应用启动时初始化数据库,这个可以通过配置spring.jpa.generate-ddl = false来关闭,关于spring.jpa的配置,更过的可以看JpaProperties类:

然后在 JpaBaseConfiguration中会去使用这些个配置:

我们可以看到spring.jpa.generate-ddl的配置是在JpaVendorAdapter中使用,那JpaVendorAdapter作用是什么呢?

jpaVendorAdapter:用于设置 JPA 实现厂商的特定属性,如设置 hibernate 的是否自动生成 DDL 的属性 generateDdl,这些属性是厂商特定的,因此最好在这里设置。目前 spring 提供 HibernateJpaVendorAdapter,OpenJpaVendorAdapter,EclipseJpaVendorAdapter,TopLinkJpaVenderAdapter 四个实现。其中最主要的属性是 “database”,用来指定使用的数据库类型。从而根据数据库类型决定如何将数据库特定异常转换为 Spring 一致性异常。目前支持以下数据库:DB2,DERBY,H2,HSQL,INFORMIX,MYSQL,ORACLE,POSTGRESQL,SQL_SERVER,SYBASE.

如果使用 Hibernate 作为 JPA 的实现,spring.jpa.hibernate.ddl-auto给出了一种更加细粒度的配置方式,其中包括以下几种取值:

在实际生产环境中,一般不会使用内嵌数据库,因此不用专门配置,即默认为none即可。数据库 DDL 通常是通过类似 Mybatis Migration 和 Flyway 等数据库版本管理工具来维护的。

下面介绍一些常用的注释。

@Entity 和 @Table

@Entity标注用于实体类,表明该 Java 类为实体类,将映射到指定的数据库表。

当实体类与其映射的数据库表名不同名时,需要使用@Table标注说明。@Table标注与@Entity标注一同使用,置于实体类声明语句之前。

@Table标注的常用属性是name,用于指明数据库的表名。

@Id 和 @GeneratedValue

@Id标注应用于实体类的属性或者属性对应的getter方法,表示该属性映射为数据库表的主键。

@GeneratedValue与@Id一同使用,表示主键的生成策略,通过strategy属性指定。

在javax.persistence.GenerationType中定义了以下几种可供选择的策略:

@Basic

@Basic表示属性到数据库表的字段的映射。一个@Entity标注的实体类中的属性,如果没有任何标注,默认即为@Basic,比如Customer类中的firstName和lastName属性。

@Basic有两个常用属性:

比如 customer 表的 lastName 字段不能为空,可以如下设置:

@Column

当实体类的属性与其映射的数据库表的列名称不同时,可以使用@Colunm标注。该标注描述了数据库表中该字段的详细定义,包含以下属性:

@Transient

@Transient表示该属性并非一个到数据库表的字段的映射,JPA 将忽略该属性。

如果一个属性并非数据库表的字段映射,就务必将其标注为@Transient,否则 JPA 默认其注解为@Basic。

@Temporal

在数据库中,表示时间类型的数据有 DATE,TIME,和 TIMESTAMP 三种精度 (即单纯的日期,时间,或者两者兼备)。 可使用@Temporal来设置Date类型的属性映射到对应精度的字段。

@Lob

@Lob标注表示将属性映射成数据库支持的大对象类型,Clob 或者 Blog。其中:

一般情况下并不需要太多的设置,其默认行为足以处理大部分场景,这也是约定大于配置的原则。

可置于属性的标注都能置于对应的getter,一般情况下应该在整个项目中使用其中一种方式,而不能混用。

更多 Entity 的标注,参考 Hibernate 文档

参考自Spring Data JPA 实战入门训练。

这是 jpa 的第三篇,你的鼓励是我继续写下去的动力,期待我们共同进步。
这个时代,每个人都是超级个体!关注我,一起成长!

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注