2017-05-11 6 views
0

그래서 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가 다른 이유로 있어야 할 수 있습니까?

답변

0

좋아, 대답은 아주 간단했다, 나는 테이블에서 NOT NULL Annotation을 삭제해야만했다. 이제 모든 것이 잘 작동한다.

관련 문제