我想使用HSQLDB作为嵌入式数据库,但是在将它连接到auto-increment.时遇到了困难。
据我所知,可以使用[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>发布于 2012-02-19 00:57:39
下面是一个打印出来的例子
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();
}
}发布于 2012-02-19 15:30:39
如果您使用ORM,它们将为您执行标识列。山梨使使用注释变得很容易。有关示例,请参阅项目中的org.sormula.tests.identity包。
定义的行类:
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包含在测试中。
https://stackoverflow.com/questions/9345369
复制相似问题