java - 如何让 Statement.getGenerateKeys 工作

标签 java sql jdbc hsqldb

我的方法 getGeneratedKeys() 有问题的java.sql.Statement

首先是我的代码:

创建.sql:(HSQLDB)

create table Ticket (
    ticketID  INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    persID INTEGER NOT NULL REFERENCES Mitarbeiter(persID),
    zeitpunkt TIMESTAMP(0) NOT NULL,
    betreff VARCHAR(100) NOT NULL,
    text VARCHAR(1000) NOT NULL,
    wichtig BOOLEAN NOT NULL,
    istGeloest BOOLEAN NOT NULL
);

DAO 的创建方法:

@Override
public Ticket create(Ticket t) throws PersistenceException {
    if( t == null ) {
        log.error("PersistenceTicket.create(Ticket t) wurde ein null parameter übergeben");
        throw new PersistenceException("TicketParameter ist null");
    }
    PreparedStatement pst = null;

    try {
        pst = con.prepareStatement("INSERT INTO ticket(persID, zeitpunkt, betreff, text, wichtig, istGeloest) VALUES (?,?,?,?,?,?)");

        pst.setInt(1, t.getPersID());
        pst.setTimestamp(2, t.getZeitpunkt());
        pst.setString(3, t.getBetreff());
        pst.setString(4, t.getText());
        pst.setBoolean(5, t.isWichtig());
        pst.setBoolean(6, t.istGeloest());

        int result = pst.executeUpdate();
        if( result > 1 ) {
            return null;
        }

        ResultSet rs = pst.getGeneratedKeys();
        if( rs.next() ) {
            t.setTicketID(rs.getInt(1));
        }
        else {
            log.debug("No keys generated");
        }
        log.info("Ticket mit Betreff " + t.getBetreff() + " in die Datenbank gespeichert" );

        pst.close();
    } catch (SQLException e) {
        log.error("Error beim create: " + e.getMessage());
    }
    return t;
}

然后我有一个单元测试来测试生成的 key :

@Test
public void specialCreateTest() throws PersistenceException {
    Ticket a = this.persT.create(this.testTicket);
    Ticket b = this.persT.create(this.testTicket);
    log.debug(a.getTicketID() +  " < " +  b.getTicketID());
    assertTrue(a.getTicketID() < b.getTicketID());
}

当我运行测试时,我收到一个失败消息和以下日志:

DEBUG at.ac.tuwien.sepm.persistence.PersistenceTicketImpl  - No keys generated
DEBUG at.ac.tuwien.sepm.persistence.PersistenceTicketImpl  - No keys generated
DEBUG at.ac.tuwien.sepm.unittests.APersistenceTicketTest  - 0 < 0

所以问题是 .getGeneratedKeys() method returns an empty set, otherwise we wouldn没有看到日志,没有生成 key

最佳答案

改变

pst = con.prepareStatement("INSERT INTO ticket(persID, zeitpunkt, betreff, text, wichtig, istGeloest) VALUES (?,?,?,?,?,?)");

pst = con.prepareStatement("INSERT INTO ticket(persID, zeitpunkt, betreff, text, wichtig, istGeloest) VALUES (?,?,?,?,?,?)", 
        Statement.RETURN_GENERATED_KEYS);

否则,PreparedStatement 不会返回键。

关于java - 如何让 Statement.getGenerateKeys 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24082862/

相关文章:

sql-server - 如何复制包含除标识列之外的每一列的行 (SQL Server 2005)

java - cassandra 与 JDBC 接口(interface)出现奇怪的十六进制

java - CQL JDBC 1.2.5 是否与 cassandra-thrift-2.0.1 和 cassandra-clientutil-2.0.1 兼容?

java - MS Access 数据库备份版本控制

java - 字节码操作安全吗

Java 反射 API 包装器(该死的检查异常困惑)

java - 将实际输入值存储到数组中以便与另一个数组进行比较

SQL - 如果记录为 NULL 因为表中不存在记录,则为 CASE 语句

PHP SQL 插入错误

mysql - 使用 JPA 在数据库中插入符号时出错