Java 如何使Statement.getGeneratedKeys正常工作

Java 如何使Statement.getGeneratedKeys正常工作,java,sql,jdbc,hsqldb,Java,Sql,Jdbc,Hsqldb,我对java.sql.Statement的方法getGeneratedKeys()有问题 首先,我的代码是: create.sql:(HSQLDB) 从DAO创建方法: @Override public Ticket create(Ticket t) throws PersistenceException { if( t == null ) { log.error("PersistenceTicket.create(Ticket t) wurde ein null par

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

首先,我的代码是:

create.sql:(HSQLDB)

从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());
}
@测试
public void specialCreateTest()引发PersistenceException{
票证a=this.persT.create(this.testTicket);
票证b=this.persT.create(this.testTicket);
log.debug(a.getTicketID()+“<”+b.getTicketID());
assertTrue(a.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
DEBUG at.ac.tuwien.sepm.persistence.PersistenceTicketImpl-未生成任何键
调试at.ac.tuwien.sepm.persistence.PersistenceTicketImpl-未生成任何键
调试at.ac.tuwien.sepm.unittests.APersistenceTicketTest-0<0
因此问题在于
.getGeneratedKeys()方法返回一个空集,否则我们将看不到没有生成键的日志

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

否则,
PreparedStatement
不会返回键

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);