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