上篇文章讲解了spring boot JPA的基本的增删改查操作,这次我们主要讲下实体类中基本注解的使用方法
spring boot JAP 中定义实体类时,用到的基本注解包括:
@Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Transient、@Column、@Temporal、@Enumerated、@Lob
下面首先依次解释下每个注解的意思
再通过实例,练习下各个注解的使用
项目地址
@Entity
应用于实体类,表明该实体类被JPA管理,将映射到指定的数据库表
@Table
应用于实体类,通过name
属性指定对应该实体类对应数据库中的表名
@Id
被@Id标记的属性对应数据库表的主键,一个实体类里面必须有一个.
@GerneratedValue
于@Id一同使用,定义主键的生成策略,通过strategy
属性指定。
JPA提供的生成策略一共有4个值:
@Basic
应用于实体类属性,表明该字段是要映射到数据库表,@Entity标注的实体类,所有属性默认为@Basic,@Baisc有两个属性:
fetch
:属性的读取策略,有EAGER
和LAZY
两种取值,分别表示主动抓取和延迟抓取,默认为EAGER
optional
:表示该属性是否可以为null
,默认值为true
。@Basic(fetch =FetchType.LAZY)标注某属性时,表示只有调用Hibernate对象的该属性的get方法时,才会从数据库表中查找对应该属性的字段值
@Column
应用于实体类属性,可以指定数据库表字段的名字和其他属性。其属性包括:
name
:表示数据库表中该字段的名称,默认情形属性名称一致。
nullable
:表示该字段是否允许为null
,默认为true
。
unique
:表示该字段是否是唯一标识,默认为false
。
length
:表示该字段的大小,仅对String
类型的字段有效。
insertable
:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为true
。
updateable
:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true
。对于一经创建就不能更改的字段,该属性非常有用,比如email
属性。
columnDefinition
:表示该字段在数据库中的实际类型。通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是依然有些例外:
Date
类型无法确定数据库中字段类型究竟是DATE
、TIME
还是TIMESTAMP
String
的默认映射类型为VARCHAR
,如果希望将String
类型映射到特定数据库的BLOB
或TEXT
字段类型,则需要进行设置@Transient
作用在类属性上,与@Basic作用相反,表明该属性不需要持久化,JPA映射数据时忽略该属性;
@Temporal
作用在类属性上,用来设置Date类型的属性映射到数据库时的精度,
@Temporal(TemporalType.DATE)
映射为日期 // date (只有日期)@Temporal(TemporalType.TIME)
映射为日期 // time (是有时间)@Temporal(TemporalType.TIMESTAMP)
映射为日期 // date time (日期+时间)@Lob
应用到实体类属性上,表示将属性映射成数据库支持的大对象类型,Clob或者Blog。其中:
java.sql.Clob
、Character[]
、char[]
和 String
将被映射为 Clob 类型。java.sql.Blob
、Byte[]
、byte[]
和 实现了Serializable
接口的类型将被映射为 Blob 类型。因为这两种类型的数据一般占用的内存空间比较大,所以通常使用延迟加载的方式,与@Basic
标注同时使用,设置加载方式为FetchType.LAZY
。
好了,开始撸代码
新建一个Blog类
@Entity
@Table(name = "t_blog")
public class Blog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Basic
private String title;
@Temporal(TemporalType.TIMESTAMP)
private Date createtime;
@Transient
private String author;
@Column(name = "blog_content", nullable = false)
@Lob
@Basic(fetch = FetchType.LAZY)
private String content;
}
@Entity 告诉JPA该实体类Blog需要映射到数据库
@Tabel 指定Blog类映射时,数据库对应的表名为t_blog
@Id @GeneratedValue 指定t_blog表的主键为id,采用自增长的方式生成主键
@Basic 为默认属性,可以不指定
@Temporal 指定日期字段createtime的映射格式为:日期+时间
@Transient 指定author字段不映射到数据库表
@Column 指定字段content映射t_blog表时的列名为blog_content,nullable = false 值不能为null
@Lob 标明该字段为大对象,并给该字段配置了懒加载
执行程序, 日志显示建表成功
打开navicate 刷新 ~~