作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的方法 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/
我是一名优秀的程序员,十分优秀!