JPA学习笔记(四)——使用Table策略来生成主键
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。但是这个值我们不需要去理会。
到了这一步,就全部完成
版权声明:本文为博主原创文章,未经博主允许不得转载。