`
qqdwll
  • 浏览: 136644 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate, JPA, and Sequences

阅读更多


         这篇文章主要介绍Hibernate 和 JPA 在Stack 3.x下如何与数据库的sequences 交互。这里介绍了一些common的用例, 但并不打算详细介绍Hibernate 或JPA的 ID 生成策略。这篇文章可以帮助你避免常见的陷阱以及可以解答下面的这些问题:
  • 当我调用entityManager.persist(obj), 同时数据库的sequences返回的值是正数时,但为什么持久的对象ID是负数。
  • 为什么发生ORA-00001错误: 持久化对象时发生违反唯一性限制
  • console上的提示信息 "Pooled optimizer source reported -x as the initial value; use of 1 or greater highly recommended"  是什么意思?


基础

Oracle中, 常用sequences代理主键生成策略。 在对象持久化时,Hibernate/JPA 可以配置成用sequence 赋值给对应的fields。

实践小结
在JPA中, 把注解SequenceGenerator中的allocationSize 的值设置为默认50。这个值往往不是我们所期望的。而且这个值大家都应该显示设置。如果数据库中sequence的步长为1时 (这个值是数据库的默认值), 应该把allocationSize 值设置为1.

Hibernate中新的主键策略和优化性能
在Hibernate 3.2.3 中, 引进了两种提高主键生成策略的可移植性和性能。 其中的一种就是SequenceStyleGenerator. 当Hibernate被配置成用这种新的映射时, 并且后台是Oracle数据库, 生成策略就是上面描述的那样。 此外, 用这种增前的主键生成策略, 如果数据库中的sequence步长大于1, 并且allocationSize 的值与它一样。Hibernate will fill in the holes between the values returned by the sequence and therefore save trips to the database.   (也就是sequence步长之间的间隙值, 有Hibernate补上, 这样就不用到数据库中请求真实的sequence的值了 )

建议
新的主键生成策略与老的有很大的区别, 当使用老的生成策略时, allocatiionSize 的值并不鼓励设置的比1大。否则的话, 如果所有插入数据的地方这个配置不相同的话, 会导致主键冲突。 当使用新的策略时, 我们也建议你把它设置为1, 除非你需要这些微小的性能提升。

用例
这些例子, 假设你使用LDS Java Stack version 3.x 配置成主键增强。 具体配置请参考http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/ch01.html#ann-setup-properties


例1  Increment By 1
如果你并不需要性能提高, 或者不能忍受主键的不连续。把数据库中的sequence, JPA/Hiebernate生成器的步长都设为1.

数据库:
CREATE SEQUENCE example_sq START WITH 1 INCREMENT BY 1;



PO类:
@Id@SequenceGenerator(name = "ExampleSequence", sequenceName = "SEQ_EXAMPLE_PK", allocationSize=1)@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ExampleSequence")private Long id;


使用这种配置, JPA/Hibernate在持久化事例之前, 会从数据库中的sequence中取出下一个值并用这个值去设置ID。

例2 Increment By 50
如果你需要提高性能, 并且可以容忍ID的不连续性, 那么就把sequence和 JPA/Hibernate的生成步长大于2. 这样可以使用Hiebernate的优化。


数据库:
CREATE SEQUENCE example_sq START WITH 50 INCREMENT BY 50;



PO类:
@Id@SequenceGenerator(name = "ExampleSequence", sequenceName = "SEQ_EXAMPLE_PK", allocationSize=50)@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ExampleSequence")private Long id;


使用这个配置后, Hibernate从数据库中的sequence取得下一个值(假设是250), 减去allocationSize的值(250-50=200), 每次增长1, 并且把结果(201)作为一个新实体类持久化的ID值。  对于下一个新的持久化对象, Hibernate会用之前的值加1且不用去数据库中调用sequence值。 它一直持续到等于开始从数据库中sequence返回的值 (250), 然后才再次从数据库中去取sequence的下一个值。  如此反复。

不一致性问题
If you create the sequence with the default "increment by" of 1, but do not set the incrementBy to 1 on the SequenceGenerator annotation, you will end up with a unique constraint violation trying to persist new objects to the database. The hibernate generator operates under the assumption that it can behave as described above, using a pool of id's. It doesn't verify that the sequence is not incrementing by 50. The first 50 rows will insert properly with id's ranging from -48 to 1. Hibernate will attempt to insert the 51st record with an id of -47 which will generate an ORA-00001: unique constraint violated.

如果创建的sequence步长是默认的1, 但没有在SequenceGenerator 注解中显示设置步长, 那么就会导致持久化一个PO对象时发生唯一性冲突。 Hiebernate主键生成器默认假设能用我们上面描述的 ID池。 它并不会去验证sequence是不是步长为50的。 前面的50行记录的范围会从-48到1且可以正确插入。 当Hiebernate试图插入第51个记录时(2-50+1=-47)会发生ORA-00001错误: 唯一性冲突。

英文原文: https://tech.lds.org/wiki/Hibernate,_JPA,_and_Sequences
0
4
分享到:
评论

相关推荐

    Hibernate JPA jar包

    **Hibernate JPA 框架详解** Hibernate JPA(Java Persistence API)是Java平台上的一个标准,用于管理和持久化应用程序中的对象。它提供了一种在Java应用和关系数据库之间进行数据映射的方法,使得开发者可以使用...

    hibernate jpa 入门案例依赖jar

    在Java世界中,Hibernate和Java Persistence API (JPA) 是两个强大的对象关系映射(ORM)框架,它们简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。本篇文章将深入探讨Hibernate JPA入门案例所需的...

    springmvc spring hibernate jpa maven 整合

    这个项目"springmvc spring hibernate jpa maven 整合"就是这样一个例子,它整合了四个关键的技术组件:Spring MVC、Spring、Hibernate和JPA,以及依赖管理工具Maven。让我们详细探讨这些技术及其在项目中的作用。 ...

    hibernate jpa开发需要的所有包

    在Java世界中,Hibernate JPA(Java Persistence API)是一种广泛使用的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库。本压缩包包含的文件是进行Hibernate JPA开发所需的核心库,让我们...

    hibernate-jpa-2.1-api-1.0.2.Final-API文档-中文版.zip

    赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...

    HibernateJPA+Struts2.0+MariaDB实现登录功能

    在IT行业中,构建一个完整的Web应用常常涉及到多个技术的整合,本示例中提到了"HibernateJPA+Struts2.0+MariaDB"的组合,这是一个经典的Java Web开发架构,用于实现用户登录功能。接下来,我们将深入探讨这些技术...

    hibernate_ jpa.jar

    《深入理解Hibernate JPA:构建高效持久层框架》 Hibernate JPA,全称为Java Persistence API,是Java领域中用于管理数据库对象的一种规范,它为Java应用程序提供了统一的ORM(对象关系映射)解决方案。Hibernate...

    Hibernate JPA 实例

    【标题】"Hibernate JPA 实例" 【描述】在IT领域,Hibernate是一个广泛使用的对象关系映射(ORM)框架,而Java Persistence API (JPA)是Java平台上的一个标准,用于管理和持久化Java应用程序中的对象。这个实例是...

    hibernate-jpa-2.1-api-1.0.2.Final-API文档-中英对照版.zip

    赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    Hibernate JPA提供了JPA规范的全部功能,并且在JPA的基础上扩展了一些特性,如更强大的 Criteria 查询、HQL(Hibernate Query Language)等。Hibernate JPA因其灵活性和广泛社区支持而受到欢迎,尤其是在处理复杂...

    hibernate-jpa.jar

    《Hibernate JPA:Java持久化框架的基石》 Hibernate JPA,全称为Hibernate Java Persistence API,是Hibernate组织提供的一种基于Java平台的企业级对象关系映射(ORM)解决方案,它实现了Java Persistence API...

    Hibernate JPA

    ### Hibernate JPA 知识点详解 #### 一、Hibernate JPA 概述 **Hibernate**作为当前最为流行的对象关系映射(Object Relational Mapping, ORM)框架之一,在Java开发领域占据着举足轻重的地位。它最早实现了**Java...

    HIbernate Jpa 生成entities

    标题:“Hibernate JPA 生成Entities” 在Java开发中,Hibernate是一个广泛使用的对象关系映射(ORM)框架,而Java Persistence API (JPA) 是Java平台上的标准ORM规范。两者结合,可以让开发者轻松地将数据库表与...

    hibernate-jpa-2.1-api-1.0.0.final.jar.zip

    《深入理解Hibernate JPA 2.1 API》 在Java世界中,ORM(Object-Relational Mapping)框架已经成为开发数据库应用程序不可或缺的一部分。其中,Hibernate作为一款功能强大的ORM框架,极大地简化了Java对象与数据库...

    hibernate-jpa-2.1-api-1.0.0.final-sources.jar

    hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码

    SpringMVC +Hibernate JPA+Spring-data-jpa实例

    **SpringMVC、Hibernate JPA与Spring Data JPA详解** SpringMVC是Spring框架的一部分,主要负责处理Web应用中的模型-视图-控制器(MVC)架构。它提供了一个轻量级、灵活的Web开发解决方案,使开发者可以方便地创建...

    spring 整合 hibernate jpa2 实例

    接下来,为了使用Hibernate作为JPA提供商,我们需要在项目的pom.xml文件中添加Hibernate和Spring Data JPA的依赖。Spring Data JPA是Spring的一个模块,它提供了对JPA的高级抽象,使得我们可以很容易地实现CRUD操作...

    基于HibernateJPA最新案例

    《基于Hibernate JPA的最新实践解析》 在现代Java开发中,对象关系映射(ORM)框架如Hibernate已经成为必备工具,极大地简化了数据库操作。本文将深入探讨基于Hibernate的Java Persistence API (JPA)的最新应用案例...

Global site tag (gtag.js) - Google Analytics