그래서 SQL 테이블에 ID를 설정해야하기 때문에 삽입 쿼리가 실행되기 전에 트리거해야하는 H2 트리거를 만들려고합니다. 다른 테이블에서 먼저 생성해야합니다.H2 트리거가 트리거되지 않습니다.
삽입이 같은 모습을 어떻게해야 테이블 :
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에서 트리거가 표시되지만 성분을 삽입하려고 할 때 ID에 NULL이 허용되지 않는다고하는 SQL 오류가 발생합니다. 하지만 정확히 그 방아쇠가해야 할 일이 무엇입니까? 나는 단지 Trigger로부터 init 로그 메시지 만 볼 수있다. 그래서 나는 그것이 호출되지 않는다고 말하면서 relativly shure이다. 나는 5 번처럼 파일을 생성 할 때 classpath를 체크하고, 심지어 Trigger.class.getName()으로 프린트하게한다.
저는 Maven과 Spring을 사용하고 있습니다. Classpath가 다른 이유로 있어야 할 수 있습니까?