spirng data JPA教程(二)基本注解的使用

spirng data JPA教程(二)基本注解的使用

上篇文章讲解了spring boot JPA的基本的增删改查操作,这次我们主要讲下实体类中基本注解的使用方法

spring boot JAP 中定义实体类时,用到的基本注解包括:

@Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Transient、@Column、@Temporal、@Enumerated、@Lob

下面首先依次解释下每个注解的意思

再通过实例,练习下各个注解的使用
项目地址

1.基本注解

@Entity

应用于实体类,表明该实体类被JPA管理,将映射到指定的数据库表

@Table

应用于实体类,通过name属性指定对应该实体类对应数据库中的表名

@Id

被@Id标记的属性对应数据库表的主键,一个实体类里面必须有一个.

@GerneratedValue

于@Id一同使用,定义主键的生成策略,通过strategy属性指定。

JPA提供的生成策略一共有4个值:

  • AUTO — JPA自动选择合适的策略,是默认选项
  • IDENTITY — 采用数据库ID自增长的方式生成主键值,一般用于MySQL数据库,Oracle不支持这种方式;
  • SEQUENCE — 通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;
  • TABLE — 通过表产生主键,会生成一张表模拟序列产生主键,该策略通用性强易于数据库的移植,但是效率低

@Basic

应用于实体类属性,表明该字段是要映射到数据库表,@Entity标注的实体类,所有属性默认为@Basic,@Baisc有两个属性:

  1. fetch:属性的读取策略,有EAGERLAZY两种取值,分别表示主动抓取和延迟抓取,默认为EAGER
  2. 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类型无法确定数据库中字段类型究竟是DATETIME还是TIMESTAMP
    • String的默认映射类型为VARCHAR,如果希望将String类型映射到特定数据库的BLOBTEXT字段类型,则需要进行设置

@Transient

作用在类属性上,与@Basic作用相反,表明该属性不需要持久化,JPA映射数据时忽略该属性;

@Temporal

作用在类属性上,用来设置Date类型的属性映射到数据库时的精度,

  • @Temporal(TemporalType.DATE)映射为日期 // date (只有日期)
  • @Temporal(TemporalType.TIME)映射为日期 // time (是有时间)
  • @Temporal(TemporalType.TIMESTAMP)映射为日期 // date time (日期+时间)

@Lob

应用到实体类属性上,表示将属性映射成数据库支持的大对象类型,Clob或者Blog。其中:

  • Clob(Character Large Ojects)类型是长字符串类型,java.sql.ClobCharacter[]char[]String 将被映射为 Clob 类型。
  • Blob(Binary Large Objects)类型是字节类型,java.sql.BlobByte[]byte[] 和 实现了Serializable接口的类型将被映射为 Blob 类型。

因为这两种类型的数据一般占用的内存空间比较大,所以通常使用延迟加载的方式,与@Basic标注同时使用,设置加载方式为FetchType.LAZY

2.基本注解的使用

好了,开始撸代码

新建一个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 刷新 ~~

猜你喜欢

转载自blog.csdn.net/bdqx_007/article/details/86373144
今日推荐