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

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

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

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

如何使用Table策略生成主键

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

这里写图片描述

表名:ID_GENERATOR

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


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

往这张表里面插几条数据

ID PK_NAME PK_VALUE
1 CUSTOMER_ID 1
2 STUDENT_ID 10
3 ORDER_ID 100


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")
@Entity
public 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。但是这个值我们不需要去理会。

到了这一步,就全部完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值