所以我试图创建一个H2触发器,它应该在执行Insert查询之前触发,因为我需要在SQL表中设置一个ID,我需要先在另一个表中创建
插入应该发生的表格如下所示:
CREATE TABLE IF NOT EXISTS INGREDIENTS(
ID INT NOT NULL,
Name VARCHAR(50),
ALK INT check (ALK <= 100 and ALK >= 0),
CalPerHundred INT,
PRICE DOUBLE check(PRICE>=0),
FOREIGN KEY (ID) REFERENCES ITEM(ID)
);
为触发器创建:
CREATE TRIGGER IF NOT EXISTS ING_TRIGGER
BEFORE INSERT
ON INGREDIENTS
FOR EACH ROW
CALL "Partyplaner.Persistence.Trigger.IngredientsTrigger";
触发器的代码:
public class IngredientsTrigger implements Trigger {
private Logger LOGGER = LoggerFactory.getLogger(IngredientsTrigger.class);
@Override
public void init(Connection conn, String schemaName,
String triggerName, String tableName, boolean before, int type)
throws SQLException {
LOGGER.debug("hello im init");
}
@Override
public void fire(Connection conn, Object[] oldRow, Object[] newRow)throws SQLException {
LOGGER.debug("hello im fire");
PreparedStatement pstmt_key;
try {
pstmt_key = conn.prepareStatement("INSERT INTO ITEM () VALUES ()");
} catch (SQLException e) {
throw e;
}
pstmt_key.executeUpdate();
ResultSet generatedKeys = pstmt_key.getGeneratedKeys();
generatedKeys.next();
int id = generatedKeys.getInt(1);
generatedKeys.close();
newRow[0]=id;
}
@Override
public void close() throws SQLException {}
@Override
public void remove() throws SQLException {}
}
我可以在H2 WebInterface中看到触发器,但是当我试图插入一个成分时,我得到一个SQL错误,它说ID不允许NULL;但那究竟是什么触发器应该做的?我只看到来自Trigger的init日志消息,所以我相对来说它没有被调用,我检查了创建文件中的类路径,如5次,甚至让它用Trigger.class.getName打印()。
我使用Maven和Spring,可能是因为Classpath必须是其他东西吗?
答案 0 :(得分:0)
好的,答案非常简单,我必须从表中删除NOT NULL Annotation,现在一切正常。