栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有SequenceGenerator的javax.persistence.EntityExistsException

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有SequenceGenerator的javax.persistence.EntityExistsException

allocationSize
参数必须与
INCREMENT BY
序列的值匹配。

它的工作方式是Hibernate从序列(从数据库)中获取一个值,然后将该值保存在内存中,并生成下一个X后续标识符(其中X =
allocationSize)在内存中将该值加1,而无需到达数据库。

Hibernate生成X标识符后,它将从序列中获取下一个值,并生成新的X标识符,并将该值增加1


一个简单的例子-假设:

  • @SequenceGenerator( ....allocationSize=5 ...)
  • CREATE SEQUENCE .... INCREMENT BY 1 ...

在上述情况下,Hibernate:

  1. 从序列中获取第一个数字-说说
    NextVal = 1
    并将其存储在内存中
  2. 生成
    allocationSize=5
    将上述值加1的下一个标识符,即:
    Id = 1, 2, 3, 4, 5
  3. 从序列中获取下一个数字-由于
    INCREMENT BY 1
    nextVal
    将为:
    2
  4. 生成
    allocationSize=5
    将上述值加1的下一个标识符,即:
    Id = 2, 3, 4, 5, 6

如您所见,它将导致双重错误。


现在请考虑这种情况:

  • @SequenceGenerator( ....allocationSize=5 ...)
  • CREATE SEQUENCE .... INCREMENT BY 5 ...

在这种情况下,hibernate:

  1. 从序列中获取第一个数字-说说
    NextVal = 1
    并将其存储在内存中
  2. 生成
    allocationSize=5
    将上述值加1的下一个标识符,即:
    Id = 1, 2, 3, 4, 5
  3. 从序列中获取下一个数字-由于
    INCREMENT BY 5
    nextVal
    将为:
    6
  4. 生成
    allocationSize=5
    将上述值加1的下一个标识符,即:
    Id = 6, 7, 8, 9, 10

在这种情况下,没有重复的错误。


最后一种情况的缺点是,如果该序列在Hibernate之外使用,则该序列将产生间隙。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506960.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号