JPA学习笔记(4)——使用Table策略来生成主键

来源:互联网 发布:网络报警电话是多少 编辑:程序博客网 时间:2024/04/29 16:04

在上一篇博客中,提到一个注解@GeneratedValue,用于标注生成主键的策略,其中一种策略就是Table。

注意:这种方法不常用,只有遇到特殊业务需求时才会用到。

关于注解,请参考JPA学习笔记(3)——JPA注解

如何使用Table策略生成主键

使用这种策略,需要创建一张表

这里写图片描述

表名:ID_GENERATOR

字段名说明ID本条记录的IDPK_NAME主键名PK_VALUE主键值


看到这里,肯定会不明所以。后面会慢慢解释

往这张表里面插几条数据

IDPK_NAMEPK_VALUE1CUSTOMER_ID12STUDENT_ID103ORDER_ID100


PK_NAME 中,CUSTOMER_ID 表示为CUSTOMER这张表生成ID,它的值为PK_VALUE=1,这个值并不代表CUSTOMER的ID就是1,而是通过一种算法来自动生成ID,而这个算法跟这个PK_VALUE有关。

相同的,STUDENT_ID表示为STUDENT表生成ID,值为10

那么JPA怎么知道要根据这张表来为其他三张表生成ID呢?

根据横纵坐标来定位到PK_VALUE

这里写图片描述

使用注解来告诉JPA横纵坐标

package com.jpa.helloworld;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;import javax.persistence.TableGenerator;@Table(name="T_ORDER")@Entitypublic class Order {    @Column(name="ID")    @TableGenerator(name="ID_GENERATOR",  //生成器名称                    table="ID_GENERATOR", //生成器使用的表                    pkColumnName="PK_NAME", //表中对应的字段名                    pkColumnValue="ORDER_ID", //上述字段的值                    valueColumnName="PK_VALUE", //值                     //根据上述三个属性,就可以定位到表中的PK_VALUE的值,如:1,10,100                    allocationSize=10)//表示主键一次增加10    @GeneratedValue(strategy=GenerationType.TABLE,                    generator="ID_GENERATOR")//这里的生成器和上面的生成器名称对应    @Id    private Integer id;    @Column(name="ORDER_NAME")    private String orderName;    @JoinColumn(name="USER_ID")    @ManyToOne    private User user;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getOrderName() {        return orderName;    }    public void setOrderName(String orderName) {        this.orderName = orderName;    }    public User getUser() {        return user;    }    public void setUser(User user) {        this.user = user;    }    @Override    public String toString() {        return "Order [id=" + id + ", orderName=" + orderName + ", user="                + user + "]";    }}


每次ORDER表增加的记录,主键增加10,如此同时,ID_GENERATOR这张表中,对应的PK_VALUE的值会增加1。但是这个值我们不需要去理会。

到了这一步,就全部完成

0 0
原创粉丝点击