一尘不染

对于主要数据库,实际上为“ GenerationType.AUTO”选择了什么策略?

hibernate

Hibernate的单证(5.1.2.2。标识符生成器)状态

AUTO:根据基础数据库的功能选择IDENTITY,SEQUENCE或TABLE。

但是,当将特定数据库定义为GenerationType.AUTO时,我无法找到文档/概述用于特定数据库的@GeneratedValue策略。

是否有人知道是否维护着主要数据库(例如Oracle,DB2,PostgreSQL,MySQL,MSSQL等)的实际生成策略列表?在哪里找到它?


阅读 579

收藏
2020-06-20

共1个答案

一尘不染

该链接是关于Java Persistence API的,并且似乎定期更新。
http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing

身份测序

身份排序使用数据库中的特殊IDENTITY列来允许数据库在插入对象的行时自动为其分配ID。许多数据库(例如 MySQL,DB2,SQL
Server,Sybase和PostgreSQL)
都支持标识列。Oracle不支持IDENTITY列,但可以使用序列对象和触发器来模拟它们。

序列对象

序列对象使用特殊的数据库对象来生成ID。仅某些数据库(例如 Oracle,DB2和Postgres)
支持序列对象。通常,SEQUENCE对象具有名称,INCREMENT和其他数据库对象设置。每次选择.NEXTVAL时,序列都会增加INCREMENT。

编辑

如果诸如DB2之类的数据库同时支持IDENTITY列,并且“hibernate”序列选择“身份”列,请参见Dialect

public Class getNativeIdentifierGeneratorClass() {
    if ( supportsIdentityColumns() ) {
        return IdentityGenerator.class;
    }
    else if ( supportsSequences() ) {
        return SequenceGenerator.class;
    }
    else {
        return TableHiLoGenerator.class;
    }
}

您可以通过查看org.hibernate.dialect包中的相关方言来检查每个数据库的supportsIdentityColumns()和supportsSequences()返回的内容。

2020-06-20