2012-09-26 2 views
1

PostgreSQL에 저장된 함수와 트리거가 있습니다. 예. :시작시 PostgreSQL 트리거를 가져옵니다. Hibernate

CREATE OR REPLACE FUNCTION log_function() RETURNS TRIGGER AS $logger$ 
BEGIN 
    IF (TG_OP = 'DELETE') THEN 
     INSERT INTO logger SELECT 'D', now(), user, OLD.*; 
     RETURN OLD; 
    END IF; 
    RETURN NULL; 
END; 
$logger$ LANGUAGE plpgsql; 

그리고 트리거 :

CREATE TRIGGER logging_trigger 
AFTER INSERT OR UPDATE OR DELETE ON some_entity 
    FOR EACH ROW EXECUTE PROCEDURE log_function(); 

내가 가져 각 배포 한 후이 코드를 싶습니다. (나는 <property name="hibernate.hbm2ddl.auto" value="create-drop"/>을 가지고있다)

필자는 plpgsql 때문에 기능이 불가능하다고 생각하지만 트리거를 실행하면 효과적 일 것이라고 생각한다. import.sql에 트리거를 추가하려고 시도했으나 가지고 있습니다. org.postgresql.util.PSQLException: ERROR: syntax error at end of input

그리고이 코드를 Java 수준으로 옮기고 싶지 않습니다.

아이디어가 있으십니까?

+0

그냥 추가 : 구문 오류는 다음과 같은 이유로 인해 발생했을 수 있습니다. http://stackoverflow.com/questions/4674828/how-to-break-expression-into-more-lines-in-hibernates-import-sql 최대 절전 모드의 MultipleLinesSqlCommandExtractor는 첫 번째 세미콜론 다음에 함수가 완료된 것으로 간주하여 다른 구문 오류가 발생하기 때문에 여러 줄의 구문 분석을 추가하는 것만으로는 충분하지 않습니다. 방아쇠를 추가하면 이런 식으로 작동합니다. – mabi

답변

1

Create an @Startup @Singleton EJB이 있으며 @PostConstruct 메서드가 호출 될 때 원하는 프로 시저를 호출해야합니다. 이 트리거 절차이기 때문에 당신은 그러나 당신이 수, SQL에서 직접 호출 할 수 없습니다 :

  • INSERT, UPDATE 또는 DELETE 행을 some_entity 화재 트리거의 원인; 이상의 현명

  • 그래서이 SELECT log_startup()으로 SQL에서 호출 할 수 void을 반환 log_startup 같은라는 별도의 절차를 정의하고 있습니다

    INSERT INTO logger SELECT 'S', now(), user, NULL; 
    

    또는 무엇이든을.

    SELECT log_startup() 같은 기본 쿼리를 사용

당신은 호출 할 수 있습니다 log_startup 그리고 또한 JDBC 또는 HQL 저장 프로 시저 호출 구문 (안된) {call log_startup()}을 사용할 수 있어야한다.

당신은 간단하게 직접 트리거 프로 시저를 호출 할 수 없으므로 배포에 그 정확한 기능 실행을 할 수있는 방법은 없다.

+0

감사! 그것은 작동합니다! '@Singleton @Startup public class Init { @Inject 개인 로거 로그; private EntityManager em; @PersistenceContext (unitName = "EntityManager") public void setEm (EntityManager em) { this.em = em; } @PostConstruct public void postConstruct() { log.info ("트리거 만들기"); 쿼리 q = em.createNativeQuery ("CREATE TRIGGER logging_trigger"+ "some_entity를 삽입 또는 업데이트 한 후"+ "각 행에 대해 실행 절차 log_function();"); q.executeUpdate(); } } ' – Olga

관련 문제