gpt4 book ai didi

java - 如何使用 Spring JDBCTemplate 从唯一约束违规中恢复?

转载 作者:行者123 更新时间:2023-12-01 11:53:53 25 4
gpt4 key购买 nike

我使用 spring jdbcTemplate 和 HSQLDB 将数据插入到一个 PROFILE 表中,该表有 3 列,这些列应用了 UNIQUE 约束,即用户名、电话号码、驾驶执照号码。

我能够使用错误代码识别唯一约束违规。但由于有多个列具有唯一约束,因此此信息不足以识别列并显示适当的错误消息。

有什么想法可以实现这一点吗?

最佳答案

没有标准方法可以做到这一点。您可以解析异常消息以查找违反的约束名称。这是一个简单的例子:

public class HSqlDbTest {
public static void main(String[] args) throws Exception {
String url = "jdbc:hsqldb:mem:test";
Class.forName("org.hsqldb.jdbcDriver");
try (Connection connection = DriverManager.getConnection(url, "sa", "")) {
String createTableSql = "" +
"create table test (" +
" a integer not null, " +
" b integer not null, " +
" constraint a_uniq unique (a), " +
" constraint b_uniq unique (b) " +
") ";
try (Statement statement = connection.createStatement()) {
statement.executeUpdate(createTableSql);
}

try (PreparedStatement statement = connection.prepareStatement("insert into test (a, b) values (?, ?)")) {
statement.setInt(1, 1);
statement.setInt(2, 1);
statement.executeUpdate();

statement.setInt(1, 2);
statement.setInt(2, 1);
statement.executeUpdate();
} catch (SQLIntegrityConstraintViolationException e) {
Pattern pattern = Pattern.compile("integrity constraint violation: unique constraint or index violation; (\\w+) table: (\\w+)");
Matcher matcher = pattern.matcher(e.getMessage());
if (matcher.matches()) {
String constraintName = matcher.group(1);
String tableName = matcher.group(2);
System.out.printf("Violated constrant \"%s\" in the table \"%s\"\n", constraintName, tableName);
}
}
}
}
}

但是我劝你不要走这条路。异常消息不是标准的,如果您更改数据库,则可能会更改。如果存在多个约束违规,您只会得到第一个。

您应该做的是在表中进行单独的选择,以检查该电话号码或用户名是否已注册。这是完成任务的更可靠的方式。

关于java - 如何使用 Spring JDBCTemplate 从唯一约束违规中恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28586809/

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