【问题标题】:How to get Statement.getGeneratedKeys working如何让 Statement.getGeneratedKeys 工作
【发布时间】:2014-06-06 13:19:19
【问题描述】:

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

首先是我的代码:

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

【问题讨论】:

    标签: java sql jdbc hsqldb


    【解决方案1】:

    改变

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

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 2011-04-07
      • 2011-07-27
      • 2011-03-08
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多