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。否则会导致错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值