文档章节

GenerationType

 小小阿甘
发布于 2017/03/30 10:42
字数 596
阅读 15
收藏 0

@GeneratedValue(strategy = GenerationType.*)

/**
 * Defines the types of primary key generation strategies.
 * @see GeneratedValue
 * @since Java Persistence 1.0
 */
public enum GenerationType {

    /**
     * Indicates that the persistence provider must assign
     * primary keys for the entity using an underlying
     * database table to ensure uniqueness.
     */
    TABLE,

    /**
     * Indicates that the persistence provider must assign
     * primary keys for the entity using a database sequence.
     */
    SEQUENCE,

    /**
     * Indicates that the persistence provider must assign
     * primary keys for the entity using a database identity column.
     */
    IDENTITY,

    /**
     * Indicates that the persistence provider should pick an
     * appropriate strategy for the particular database. The
     * <code>AUTO</code> generation strategy may expect a database
     * resource to exist, or it may attempt to create one. A vendor
     * may provide documentation on how to create such resources
     * in the event that it does not support schema generation
     * or cannot create the schema resource at runtime.
     */
    AUTO
}

1.GenerationType.IDENTITY

主键由数据库自动插入,不需要额外的配置信息,当然这个数据库必须要支持主键自增策略,常见的有:MySQL, SQL Server, DB2, Derby, Sybase, PostgreSQL。实例形如:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id; //主键ID

2.GenerationType.SEQUENCE

使用序列的机制生成主键ID,数据库需要支持序列,例如Oracle不支持ID子增长列而是使用序列的机制生成主键ID,实例形如:

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="drawerSeq")
@SequenceGenerator(initialValue=1,name="drawerSeq", sequenceName="Drawer_SEQUENCE")
private long id;

同时需要创建序列:create sequence Drawer_SEQUENCE;

如果不指定序列生成器的名称,则使用厂商提供的默认序列生成器,比如Hibernate默认提供的序列名称为hibernate_sequence。
支持的数据库: Oracle、PostgreSQL、DB2

3.GenerationType.TABLE

有时候为了不依赖于数据库的具体实现,在不同数据库之间更好的移植,可以在数据库中新建序列表来生成主键,序列表一般包含两个字段:第一个字段引用不 同的关系表,第二个字段是该关系表的最大序号。这样,只需要一张序列就可以用于多张表的主键生成

@TableGenerator(name="drawerSeq",table="MGR_SEQUENCE_TABLE",pkColumnName="SEQUENCE_NAME", valueColumnName="SEQUENCE_COUNT", initialValue=1, allocationSize=1)
@GeneratedValue( strategy=GenerationType.TABLE, generator="drawerSeq")
private String id;

如果不指定表生成器,JPA厂商会使用默认的表,比如Hibernate在Oracle数据库上会默认使用表hibernate_sequence。这种方式虽然通用性最好,所有的关系型数据库都支持,但是由于不能充分利用具体数据库的特性,建议不要优先使用。

4.GenerationType.Auto

把主键生成策略交给JPA厂商(Persistence Provider),由它根据具体的数据库选择合适的策略,可以是Table/Sequence/Identity中的一种

© 著作权归作者所有

粉丝 4
博文 52
码字总数 18069
作品 0
南京
技术主管
私信 提问
detached entity passed to persist 错误的引起的原因和解决办法

detached entity passed to persist 错误的引起的原因和解决办法 报错的原因有如下的情形: 比如:在实体类中定义的变量如下: @Id @GeneratedValue(strategy=GenerationType.) @Column(name="r...

风中帆
2015/12/07
761
0
Hibernate的ID生成策略

1.介绍 Hibernate是目前最为常用的ORM框架,当然也有人会选择iBATIS或者其他的架构.这里我们着重讲Hibernate的ID生成策略 2.可选的ID策略生成方式 (1)native/auto 根据不同的数据库采用不同的...

dmrs
2015/10/15
15
0
JPA 注解参考

@Entity:映射实体类,必须指定主键 属性 描述 name 可选,对应数据库中的一个表,若表名与实体类相同可忽略 @Table:配合@Entity使用,表示实体对应数据库表信息 属性 描述 name 可选,映射...

林塬
2018/01/24
0
0
Hibernate4之JPA规范配置详解

@Table Table用来定义entity主表的name,catalog,schema等属性。 属性说明: name:表名 catalog:对应关系数据库中的catalog schema:对应关系数据库中的schema UniqueConstraints:定义一...

Zhao-Qian
2013/11/11
7.4K
0
JPA学习总结

前言 最近在做一个项目的时候因为牵涉到要对数据库的操作,在最开始实现的时候采用了直接的JDBC技术。在实现的时候,发现虽然能够实现所需要的功能,但是具体的实现比较繁琐,而且牵涉到数据...

architect刘源源
2018/01/15
43
0

没有更多内容

加载失败,请刷新页面

加载更多

PCB设计-Allegro软件入门系列-铺铜操作(下)

铺铜是PCB很常见的操作,PCB的敷铜一般都是覆地铜,增大地线面积,有利于地线阻抗降低,使电源和信号传输稳定,在高频的信号线附近敷铜,可大大减少电磁辐射干扰,起屏蔽作用。 本讲讲解啊一...

demyar
8分钟前
1
0
如何通过WASI SDK 在Linux上编译ZXing C++

Mozilla在今年三月份的时候公布了WASI。WASI的目标就是让WebAssembly在任何地方都可以运行,而不仅仅像现在这样只能运行在Node.js和Web浏览器中。WASI目前依然处于初级阶段,这篇文章分享下如...

yushulx
10分钟前
1
0
.Net界面开发神器—DevExpress官方汉化包免费下载!还在等什么?

点击获取DevExpress v19.1.7新版试用下载 DevExpress Localization Service允许您创建一组自定义的附属程序集,要将语言包添加到程序集中,请查看本文中为大家列出的对应版本的汉化包,下载并...

FILA6666
10分钟前
2
0
php生成二维码

        header('Content-Type: image/png');        //清除缓冲区,防止之前面不知道的情况下被加头部信息导致不显示图片内容        ob_clean();        $...

横着走的螃蟹
15分钟前
2
0
伪类和伪元素

伪类和伪元素 伪类和伪元素,对于绝大多数同学来说,都是耳熟能详的名字,但确实又有很多人搞不清楚它们之间的区别,以致于混淆概念。而当概念都混淆的时候,也往往意味着你不会经常使用它,...

不负好时光
18分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部