sequence mysql jpa_Java-JPA-生成器-@SequenceGen
即使这个问题非常古老,我还是因为JPA 2.0和Oracle序列问题而偶然发现。
想要分享我对某些事情的研究-
数据库序列定义中GenerationType.SEQUENCE的@SequenceGenerator(allocationSize)与INCREMENT BY之间的关系
确保将@SequenceGenerator(allocationSize)设置为与数据库序列定义中的INCREMENT BY相同的值,以避免出现问题(初始值也是如此)。
例如,如果我们在数据库中用INCREMENT BY值定义20的序列,则将SequenceGenerator中的分配大小也设置为20。在这种情况下,JPA直到到达下一个20标记时才对数据库进行调用,同时每次递增 内部值为1。 这样可以保存数据库调用,以便每次获取下一个序列号。这样做的副作用是-每当重新部署应用程序或在两者之间重新启动服务器时,它将调用数据库以获取下一批,并且您会看到序列值中的跳转。 另外,我们还需要确保数据库定义和应用程序设置保持同步,因为这两者都是由不同的组管理的,因此您可能无法始终保持同步,并且您可能会很快失去对它们的控制。 如果数据库值小于分配大小,则将看到由于Id值重复而导致的PrimaryKey约束错误。 如果数据库值大于分配大小,您将看到Id值的跳跃。
如果数据库序列INCREMENT BY设置为1(这通常是DBA所做的),则将分配大小也设置为1,以便它们是同步的,但是JPA每次都调用数据库来获取下一个序列号。
如果您不想每次都调用数据库,请使用GenerationType.IDENTITY策略,并由数据库触发器设置@Id值。 使用GenerationType.IDENTITY时,只要调用em.persist,该对象就会保存到DB,并且将id的值分配给返回的对象,因此我们不必执行em.merge或em.flush。 (这可能是JPA提供程序特定的。。不确定)
另一件事-
JPA 2.0自动运行ALTER SEQUENCE命令以同步数据库序列中的dispatchSize和INCREMENT BY。 由于大多数情况下,我们使用不同的模式名称(应用程序用户名),而不是存在序列的实际模式,并且应用程序用户名将没有ALTER SEQUENCE特权,因此您可能会在日志中看到以下警告-
000004c1运行时W CWWJP9991W:openjpa运行时:警告:无法 缓存序列“ RECORD_ID_SEQ”的序列值。 你的 应用程序无权运行ALTER SEQUENCE命令。 确保它具有运行ALTER SEQUENCE的适当权限 命令。
由于JPA无法更改序列,因此JPA每次都会调用数据库以获取下一个序列号,而不管@ SequenceGenerator.allocationSize的值如何。 这可能是不想要的结果,我们需要意识到。
要使JPA不运行此命令,请在persistence.xml中设置此值。 这样可以确保JPA不会尝试运行ALTER SEQUENCE命令。 虽然它写了一个不同的警告-
00000094运行时W CWWJP9991W:openjpa运行时:警告: 属性“ openjpa.jdbc.DBDictionary = disableAlterSeqenceIncrementBy”是 设置为true。 这意味着“ ALTER SEQUENCE ... INCREMENT BY” SQL 不会对序列“ RECORD_ID_SEQ”执行该语句。 OpenJPA 执行此命令以确保序列的INCREMENT BY值 在数据库中定义的匹配于在 实体的顺序。 禁用此SQL语句后, 用户的责任,以确保实体的顺序 定义与数据库中定义的序列匹配。
如警告中所述,重要的是我们需要确保数据库序列定义中的@ SequenceGenerator.allocationSize和INCREMENT BY是同步的,包括@SequenceGenerator(allocationSize)的默认值50。否则会导致错误。
sequence mysql jpa_Java-JPA-生成器-@SequenceGen相关推荐
- 基于javaweb+mysql的+JPA图书馆座位占座预约管理系统(管理员、老师、
基于javaweb+mysql的+JPA图书馆座位占座预约管理系统(管理员.老师.学生) 运行环境 Java≥8.MySQL≥5.7 开发工具 eclipse/idea/myeclipse/sts等均 ...
- 如何使用MySQL和JPA使用Spring Boot构建Rest API
Hi Everyone! For the past year, I have been learning JavaScript for full-stack web development. For ...
- springboot+jpa+mysql Springboot+jpa+jdbc+sqlserver 使用时遇到的一系列的问题
更改背景 正在做一个微信小程序的前后端项目,一开始使用的是springboot+jpa+mysql,但负责接受数据存入数据库的负责人执意要用sqlserver.本来微信小程序前端,以及spring b ...
- 基于javaweb+mysql的+JPA旅行网站旅游管理系统(前台、后台)
基于javaweb+mysql的+JPA旅行网站旅游管理系统(前台.后台) 运行环境 Java≥8.MySQL≥5.7 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适 ...
- docker oracle navicat_拥抱开源从零开始 Docker、Mysql amp; JPA
MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) ...
- jpa oracle mysql,oracle+jpa和mysql+mybatis的混合多数据源配置例子
最近在学习的时候看到了多数据源这一章,回想以前做的所有项目用到了MySQL,Oracle,Mybatis,SpringJpa等等. 这里不评论各自的优缺点,也不推荐该使用哪一种.大部分的文章都是单一技 ...
- jpa mysql timestamp_Java JPA设置默认值、Timestamp设置、自动获取时间
设置默认值 @Column(name="state",columnDefinition="tinyint default 0") private Integer ...
- mysql使用jpa仓储查询报错_Jpa自动查询报错
我解决了这个问题. 后来我发现报错信息中还有一行,不管我怎么尝试,都是会提示某一个变量有问题,我做了一下修改,解决了. 我下面详细写一下这个问题. 其实web开发我不熟悉,我之前不是做这个是,所以我下 ...
- java jpa_Java JPA 语法知识
前提操作 创建一个可持久化的实体类 dao层继承JpaRepository T:实体类 ID:实体类的主键类型 例:public interface SysUserRespository extend ...
最新文章
- WPF解析TTF 字体
- 《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。...
- 计算机程序设计员_第二届北京大工匠计算机程序设计员、网络与信息安全管理员挑战赛:一场互联网“战场”的巅峰对决...
- oracle 查询关键字,Oracle 中的SELECT 关键字(查询、检索)
- 基于ARM的linux嵌入式操作系统
- Electron开发入门
- c语言中判断一个字符串是否包含另一个字符串
- 快速判断二叉树先序遍历 后序遍历
- C++ Qt学习笔记(3)QT中的文本处理
- 信用卡-可恶的招商银行,可恶的循环利息
- javaeye怎么打不开了?当前!2010,10,24,23:08
- 正则表达式那些事儿(一)
- 大数据下的用户画像标签去重
- 一组Android机器人素材图片
- HIVE-启动服务-启动DG连接-迁移数据LINUX-HDFS-HIVE
- BI报表分析控件Wyn,助力数据可视化
- AI公司进入倒闭潮,5种公司最易“被倒闭”?(下)
- java实现钢琴颜色改变_Android 拨号盘按键音修改为钢琴音效果实现
- JS对HTML代码的转义(转码)和反转义(解码)
- Origin2021PRO下载
热门文章
- stm32 str转hex_【SW4STM32生成 hex文件的设置方法】
- 一些恶意软件的分析收集整理
- 由巨型计算机到微型计算机,微机原理第一章节:基础知识.ppt
- java开源游戏下载安装_开源java扫雷游戏,Swing版。
- html元素一行显示不完收缩_这些常用的HTML标签,你还不知道吗?
- n9009 Android5.0内核,三星N9009(Galaxy Note 3 电信版 Android 5.0)刷Recovery教程
- php ssh2函数,SSH2 函数 - PHP 7 中文文档
- 基于区域生长算法的图像分割python_图像分割中区域生长算法的程序设计与实现...
- vim关闭所有折叠命令
- 计算机强化课程计算机网络,大学计算机网络技术课程教学改革