2012-02-19 88 views
1

我想使用HSQLDB作为嵌入式数据库,但无法将其自动增量到自动增量使用HSQLDB自动增量(2.2.8)+ DDLUtils

据我所知,[CALL] IDENTITY()可以用来获取最后的主键值。但是,通过iBatis和HSQLDB的DatabaseManagerSwing实验持续返回0值。

如何获得自动增量以使用HSQLDB?

编辑:

我没有提到,我使用DDLUtils来自动生成表格。下面西装HSQLDB:

<?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地图:

<insert id="insertUser" parameterClass="user"> 
    <selectKey keyProperty="id" resultClass="int"> 
     CALL IDENTITY() 
    </selectKey> 
INSERT INTO USERS 
(USERNAME, PASSWORD) 
VALUES 
(#username#, #password#)  
</insert> 
+0

你使用什么版本的HSQLDB? – 2012-02-19 00:12:46

+0

@EmmanuelBourg这是2.2.8,它可能是最新的。 – 2012-02-19 00:19:53

+0

这可能是问题的根源:http://stackoverflow.com/questions/4857730/how-to-fix-hsql-datasource-txm-where-identity-always-return-0 – 2012-02-19 18:29:55

回答

4

下面是打印出

0 
1 
2 

为例在我的机器上:

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(); 
    } 
} 
+0

您用来创建表的SQL提供了解决方案:'一直生成为身份'。我没有提到我使用Apache DDLUnit自动使用XML生成表格。我将为此寻求另一个框架。 – 2012-02-19 18:49:28

1

如果您使用ORM,他们将为您执行标识列工作。 sormula使注解变得容易。有关示例,请参阅项目中的org.sormula.tests.identity包。定义

Row类:

public class IdentityTest 
{ 
    @Column(identity=true) 
    int id; 
    ... 

从org.sormula.identity.tests.InsertTest:

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被包括在测试中。