JPA学习笔记(二)——JPA 注解

本文详细介绍了JPA注解的使用,包括@Entity标识实体类,@Table定义对应表名,@Id和@GeneratedValue设定主键及其生成策略,@Basic、@Column、@Transient用于属性映射与忽略,@Temporal处理时间精度,以及@TableGenerator在表生成策略中的应用。

1. JPA注解

1.1 @Entity

标注在实体类上,表示此类对应一个数据表。

1.2 @Table

与表对应,一般要与 @Entity 一起写。

@Table(name = "JPA_CUSTOMER") // 指定表名为 JPA_CUSTOMER

加 @Table 注解时,表名即为类名,通常要加。

1.3 @Id

映射数据表中的主键,该注解可以标注在属性上,也可以写在 Getter 方法上。

1.4 @GeneratedValue

  1. 标注主键的生成策略,通过Strategy属性指定,默认情况下 JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer 对应 identity,MySQL对应 auto increment 。
  2. javax.persistence.GenerationType 中定义了几种可选的策略。
    AUTO:默认,JPA 自动选择合适的策略。
    IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持。
    SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名,Mysql不支持。
    TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。

1.5 @Basic

  1. 若无任何注解,则默认添加 @Basic 注解,表示一个属性到数据库表的字段的映射。
  2. optional:表示该属性是否允许为 null,默认为 true。

1.6 @Column

  1. 指定数据库中显示的列名,若与 Getter 后的名字一样可以不写。
  2. 该标注还有多个属性,包含 unique,nullable(可为空),length 等。
  3. 可以与 @Id 同时使用,也可以在 Getter 方法上添加。

1.7 @Transient

  1. 表明该属性并非一个到数据库表的字段的映射,ORM 框架将忽略该属性。
  2. 如果一个属性并非数据库表的字段映射,就务必将其标示为 @Transient,否则 ORM 框架默认其注解为 @Basic。
  3. 以 get 开头的工具方法,因为不需要映射为数据表的一列, 所以加 @Transient 注解。

1.8 @Temporal

  1. 由于在 Java API 中没有定义 Date 类型的精度,而数据库中有时间的精度,例如 Date,Time,TIMESTAMP 三种精度,即:日期,时间,时间戳。那么在进行属性映射时可以使用 @Temporal 注解来调整精度。
  2. javax.persistence.TemporalType 中定义了几种精度类型
    DATE:日期。
    TIME:时间。
    TIMESTAMP:时间戳。

1.9 @TableGenerator

  1. 当 @GeneratedValue 注解的主键生成策略 strategy 属性为 GenerationType.TABLE 时,就需要指定由哪张表生成主键。

  2. 例如创建一个 jpa_id_generator 表,里面包含三个字段,ID,PK_NAME,PK_VALUE。
    jpa_id_generator

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "ID_GENERATOR")
    @TableGenerator(name = "ID_GENERATOR", table = "jpa_id_generators", pkColumnName = "PK_NAME", pkColumnValue = "CUSTOMER_ID", valueColumnName = "PK_VALUE", allocationSize = 100)
    

    name:表示该主键生成策略的名称,它被引用在 @GeneratedValue 中设置的 generator 值中。
    table:表示表生成策略所依赖的表名。
    pkColumnName:确定一列。
    pkColumnValue:确定上面一列中的一行。
    valueColumnName:上面确定的一行可能有多列,通过列名唯一确定那一列,对应值将会随着每次创建累加。
    allocationSize:表示每次主键值增加的大小,默认值为 50。(我这里设置为100,然后 id 为什么从 -97 开始?哪位大佬能给我解释一下,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值