主键的值以查询的形式从一个特定的表中获取,获取完之后修改主键值,理论上可以兼容任何数据库。
要配合@GeneratedValue注解—— 注解声明了主键的生成策略。有如下属性:
strategy 指定生成的策略(JPA 定义的),类型为GenerationType(枚举)。
默认是 GenerationType. AUTO
GenerationType.AUTO 主键由程序控制
GenerationType.TABLE 使用一个特定的数据库表来保存主键
GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型)
GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是
数据库支持序列。(这个值要与 generator 一起使用)generator 指定生成主键使用的生成器)。
@TableGenerator注解属性:
@TableGenerator(
name="generator", //生成器名称
table="GENERATOR", //指定表名
pkColumnName="pk_key", //Primary key Column Name 表示在持久化表中,该主键生成策略所对应键值的名称 字符串类型
valueColumnName="pk_value", //表示在持久化表中,该主键当前所生成的值 整型
pkColumnValue="TEACHER", //主键名称,这里直接用了表名
allocationSize=1 //每次主键值增加的大小
)
实体类
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.TableGenerator;
@Entity
@TableGenerator(
name="generator",
table="GENERATOR",
pkColumnName="pk_key",
valueColumnName="pk_value",
pkColumnValue="TEACHER",
allocationSize=1
)
public class Teacher {
private int id;
private String name;
private Title title;
@Id
@GeneratedValue(strategy=GenerationType.TABLE, generator="generator") //这里的generator属性的值和上面定义的name相同,表示使用上面定义的生成器
public int getId() {
return id;
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Enumerated(value=EnumType.STRING)
@Column(name="_title", length=50)
public Title getTitle() {
return title;
public void setTitle(Title title) {
this.title = title;
}
}
测试:
@Test
public void Teacher() {
Teacher teacher = new Teacher();
teacher.setName("teacher");
teacher.setTitle(Title.C);
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.save(teacher);
transaction.commit();
session.close();
HibernateUtil.close();
}
控制台日志,可惜没有打印出从主键生成表中获取主键和修改主键的语句:
自动生成的generator表,这个表理论上可以给任何表提供主键:
结果:可以发现teacher这一行对应的pk_value字段的值是2,因为当teacher表获取主键值后就自增了