H2 触发器不触发

问题描述 投票:0回答:1

我正在尝试创建一个 H2 触发器,它应该在执行插入查询之前触发,因为我需要在 SQL 表中设置一个 ID,而我需要先在另一个表中创建该 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;但这正是触发器应该做的事情吗?我只看到来自触发器的初始化日志消息,所以我相对确定它不会被调用,我检查了创建文件中的类路径5次,甚至让它用 Trigger.class.getName() 打印。

我正在使用 Maven 和 Spring,难道 Classpath 必须是其他东西吗?

java jdbc triggers h2
1个回答
0
投票

好吧,答案非常简单,我必须从表中删除 NOT NULL 注释,现在一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.