Hibernate框架-@TableGenerator注解

本文探讨了Hibernate框架中的@TableGenerator注解,它允许主键的值通过查询特定表来获取,并在使用后自动更新。配合@GeneratedValue注解,可以设置不同的主键生成策略,如AUTO、TABLE、IDENTITY和SEQUENCE。详细介绍了@TableGenerator的属性及其用法,并通过测试案例展示了其实现过程。控制台虽未显示相关SQL语句,但生成的generator表能为任何表提供主键,确保了主键的连续性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主键的值以查询的形式从一个特定的表中获取,获取完之后修改主键值,理论上可以兼容任何数据库。
要配合@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表获取主键值后就自增了
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值