gpt4 book ai didi

java - 如何从 native JPA INSERT 获取生成的标识值?

转载 作者:行者123 更新时间:2023-11-30 11:03:15 25 4
gpt4 key购买 nike

在我的应用程序中,我正在生成一个 SQL-INSERT。此插入将作为 JPA native 查询 (Hibernate) 执行,并在我们的 SQL Server 中自动生成一个新的标识值。

如何接收生成的身份值?

我想避免对 @@IDENTITY 进行第二次选择,因为第二个用户可能同时插入了一些内容,从而导致错误的结果。(参见 Getting generated identifier for JPA native insert query)

使用@@IDENTITY 的代码如下所示:

Query statementInsert = entityManager.createNativeQuery("INSERT INTO x(colum1, column2) VALUES (:value1, :value2)");
// setting parameters...
statementInsert.executeUpdate();

Query statmentSelectId = entityManager.createNativeQuery("SELECT @@IDENTITY");
int generatedId = ((BigDecimal) statmentSelectId.getSingleResult()).intValueExact();

我更愿意将 SELECT SCOPE_IDENTITY() 放在我的 INSERT 语句后面(如中所示 How to get Identity value from SQL server after insert record ).这将需要对 JPA native 查询进行某种“批量执行”。

我梦想着这样的事情:

Query statementInsertAndSelectId = entityManager.createNativeQuery("INSERT INTO x(colum1, column2) VALUES (:value1, :value2); SELECT SCOPE_IDENTITY();");
// setting parameters...
// ?????????
int generatedId = ((BigDecimal) statementInsert.getSingleResult()); // not working, JPA complains about "No ResultSet"

在我的项目中无法使用“条件生成器”或“命名查询”。

最佳答案

即使您背对背地写它,您也可能会收到并发调用,这会使 @@IDENTITY 返回错误的值。

您需要使用@@SCOPE_INDENTITY 来获取系统范围内的最新值,而不是您范围内的最新值。根据https://msdn.microsoft.com/en-us/library/ms190315.aspx如果两个语句在同一个存储过程、函数或批处理中,则它们在同一范围内。

在 JPA 中批量获取 2 个语句可能很棘手。批量插入可能是一个挑战,需要特定于环境或特定于 hibernate (通过 JPA)的代码。参见 How to do the BATCH insert in JPA?以及有关批量插入的其他帖子。

存储过程可能是一种解决方案,但作为个人喜好,我远离存储过程。

关于java - 如何从 native JPA INSERT 获取生成的标识值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30490364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com