首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于HSQLDB (2.2.8) + DDLUtils的自动增量

基于HSQLDB (2.2.8) + DDLUtils的自动增量
EN

Stack Overflow用户
提问于 2012-02-19 00:02:20
回答 2查看 8.7K关注 0票数 1

我想使用HSQLDB作为嵌入式数据库,但是在将它连接到auto-increment.时遇到了困难。

据我所知,可以使用[CALL] IDENTITY()获得最后一个主键值。然而,通过iBatis和HSQLDB的DatabaseManagerSwing进行的实验不断地返回0值。

如何使用HSQLDB实现自动增量?

编辑:

我没有提到我正在使用DDLUtils自动生成表。以下内容不适合HSQLDB:

代码语言:javascript
复制
<?xml version="1.0"?>
<!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database.dtd">

<database name="testdb">

    <table name="users">
        <!-- using autoincrement attribute below causes
        "primary key already exists" exception -->
        <column name="id" type="INTEGER" primaryKey="true" />
        <column name="username" type="VARCHAR" size="30" />
        <column name="password" type="VARCHAR" size="100" />
    </table>

</database>

此外,以下是用于域类的iBatis SQL映射:

代码语言:javascript
复制
<insert id="insertUser" parameterClass="user">
    <selectKey keyProperty="id" resultClass="int">
        CALL IDENTITY()
    </selectKey>
INSERT INTO USERS
( USERNAME, PASSWORD ) 
VALUES
( #username#, #password#)       
</insert>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-19 00:57:39

下面是一个打印出来的例子

代码语言:javascript
复制
0
1
2

在我的机器上:

代码语言:javascript
复制
import java.io.File;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Date;

public class Test {

  public static void main(String[] args) throws Exception {

    File dbDir = new File("/tmp/identity_test"); 
    String connectionTemplate = "jdbc:hsqldb:file:%s/test";
    String connStr = String.format(connectionTemplate, dbDir);
    Connection connection = DriverManager.getConnection(connStr, "", "");
    Statement s = connection.createStatement();
    s.execute("CREATE TABLE test (id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, s VARCHAR(10))");
    PreparedStatement psInsert = connection.prepareStatement("INSERT INTO test (s) VALUES (?)");
    for (int i = 0; i < 3; i++) {
      psInsert.setString(1, "hello");
      psInsert.executeUpdate();
      PreparedStatement psIdentity = connection.prepareStatement("CALL IDENTITY()");
      ResultSet result = psIdentity.executeQuery();
      result.next();
      int identity = result.getInt(1);
      result.close();
      System.out.println(identity);
    }
    connection.close();
  }
}
票数 5
EN

Stack Overflow用户

发布于 2012-02-19 15:30:39

如果您使用ORM,它们将为您执行标识列。山梨使使用注释变得很容易。有关示例,请参阅项目中的org.sormula.tests.identity包。

定义的行类:

代码语言:javascript
复制
public class IdentityTest
{
    @Column(identity=true)
    int id;
    ...

来自org.sormula.identity.tests.InsertTest:

代码语言:javascript
复制
 IdentityTest row = new IdentityTest(-1, "Insert one");
 assert getTable().insert(row) == 1 : "insert one failed";
 assert row.getId() > 0 : "indentity column was not generated";

HSQLDB包含在测试中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9345369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档