首页 > 解决方案 > 返回新行 INSERT 时在 H2 数据库中默认生成的主键值,用于 UUID 类型列

问题描述

当使用UUID数据类型作为表的主键,并要求 H2在插入新记录时默认生成每个 UUID 值,如何访问新生成的 UUID 值的值?

我在 Java 应用程序中使用普通的 JDBC 4.x,如果这有助于解决方案。


我知道SCOPE_IDENTITY函数返回一个在标记为自动递增序列号long的列上生成的键。IDENTITY但是我使用 UUID 而不是递增的数字作为我的主键列类型。

标签: javasqljdbch2uuid

解决方案


指定生成列的名称

准备语句时,您可以选择传递为其生成默认值的列名数组。对于您的单个主键列,这意味着一个值的数组。

见方法:
Connection::prepareStatement​( String sql, String[] columnNames )

示例代码。

// here you can specify the list of returned attributes, in your case just the data
String[] returnedAttributes = {"data"};
String insertQuery = "insert into test(id) values(1);";
try 
(
    PreparedStatement insertStatement = conn.prepareStatement(insertQuery, returnedAttributes);
) 
{
    int rows = insertStatement.executeUpdate();
    if (rows == 0) 
    {
        throw new SQLException("Failed of insertion");
    }
    try (ResultSet rs = insertStatement.getGeneratedKeys()) {
        if (rs.next()) 
        {
             java.util.UUID uuid = (java.util.UUID) rs.getObject("data");
             System.out.println(uuid);
        }
    }
}

笔记

要获取您必须使用的 UUID 类型getObjct(..)并将其转换为H2 UUID Typejava.util.UUID文档中所述

通用唯一标识符。这是一个 128 位的值。要存储值,请使用 PreparedStatement.setBytes、setString 或 setObject(uuid)(其中 uuid 是 java.util.UUID)。ResultSet.getObject 将返回一个 java.util.UUID。


我的示例基于您在问题中共享的链接默认情况下为 H2 数据库引擎中 UUID 类型列上的每一行生成 UUID 值


推荐阅读