如何使Statement.getGeneratedKeys工作

时间:2014-06-06 13:19:20

标签: java sql jdbc hsqldb

我对getGeneratedKeys()

的方法java.sql.Statement有疑问

首先我的代码:

create.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;
}

然后我有一个单元测试测试生成的密钥:

@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看到日志帽没有生成密钥

1 个答案:

答案 0 :(得分:2)

更改

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不会返回密钥。

相关问题