@zhuanxu
2017-12-27T17:39:01.000000Z
字数 3229
阅读 5134
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标注用于实体类,表明该 Java 类为实体类,将映射到指定的数据库表。
当实体类与其映射的数据库表名不同名时,需要使用@Table标注说明。@Table标注与@Entity标注一同使用,置于实体类声明语句之前。
@Table标注的常用属性是name,用于指明数据库的表名。
@Id标注应用于实体类的属性或者属性对应的getter方法,表示该属性映射为数据库表的主键。
@GeneratedValue与@Id一同使用,表示主键的生成策略,通过strategy属性指定。
在javax.persistence.GenerationType中定义了以下几种可供选择的策略:
@Basic表示属性到数据库表的字段的映射。一个@Entity标注的实体类中的属性,如果没有任何标注,默认即为@Basic,比如Customer
类中的firstName和lastName属性。
@Basic有两个常用属性:
比如 customer 表的 lastName 字段不能为空,可以如下设置:
当实体类的属性与其映射的数据库表的列名称不同时,可以使用@Colunm标注。该标注描述了数据库表中该字段的详细定义,包含以下属性:
@Transient表示该属性并非一个到数据库表的字段的映射,JPA 将忽略该属性。
如果一个属性并非数据库表的字段映射,就务必将其标注为@Transient,否则 JPA 默认其注解为@Basic。
在数据库中,表示时间类型的数据有 DATE,TIME,和 TIMESTAMP 三种精度 (即单纯的日期,时间,或者两者兼备)。 可使用@Temporal来设置Date类型的属性映射到对应精度的字段。
@Lob标注表示将属性映射成数据库支持的大对象类型,Clob 或者 Blog。其中:
一般情况下并不需要太多的设置,其默认行为足以处理大部分场景,这也是约定大于配置的原则。
可置于属性的标注都能置于对应的getter,一般情况下应该在整个项目中使用其中一种方式,而不能混用。
更多 Entity 的标注,参考 Hibernate 文档
参考自Spring Data JPA 实战入门训练。
这是 jpa 的第三篇,你的鼓励是我继续写下去的动力,期待我们共同进步。