2015-01-29 3 views
0
내가 (PostgreSQL을에)로 정의 된 테이블에 스프링 JPA를 사용하여 값을 삽입하려고

을에서 null이 아닌 제약 조건을 위반JPA 삽입 쿼리 생성 PostgreSQL의

CREATE TABLE T_PERSISTENT_AUDIT_EVENT 
(id BIGINT AUTO_INCREMENT NOT NULL, 
principal VARCHAR(255) NOT NULL, 
event_date TIMESTAMP, 
event_type VARCHAR(255), 
CONSTRAINT PK_T_PERSISTENT_AUDIT_EVENT PRIMARY KEY (id)); 

엔티티는 다음과 같이 정의된다 :

@Entity 
@Table(name = "T_PERSISTENT_AUDIT_EVENT") 
public class PersistentAuditEvent { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "id") 
private Long id; 
//... 
} 

내 쿼리가 실행될 때 (스프링 보안이 실행 중일 때), null이 아닌 제약 조건을 위반하여 null 값을 테이블에 삽입하려고한다는 예외가 발생합니다.

insert into ... (id, ...) values (null, ...); 

을 그때, 삽입 문에서 내 AUTO_INCREMENT 작품을 id 컬럼을 제거하면 다음과 같이

쿼리가 생성됩니다. 그렇지 않으면 그렇지 않습니다.

삽입에서 내 ID를 무시하도록 JPA를 제어하려면 어떻게해야합니까?

+0

['IDENTITY'] (http://docs.oracle.com/javaee/7/api/javax/persistence/GenerationType.html#IDENTITY)가 어떻게 작동하는지 모르겠지만 PostgreSQL의 경우에는' GenerationType.SEQUENCE' 또는'GenerationType.AUTO'를 사용하여 'AUTO_INCREMENT'와 같은 기능을 구현할 수 있습니다. BTW'AUTO_INCREMENT'는 PostgreSQL의 순수 SQL에서는 유효하지 않습니다.'serial' 의사 형식을 사용하거나 시퀀스를 사용하십시오. – pozs

답변

0

@Entity 
@Table(name = "T_PERSISTENT_AUDIT_EVENT") 
@SequenceGenerator(
    name="PersistentAuditEventGenerator", 
    sequenceName="PAE_SEQUENCE" 
) 
public class PersistentAuditEvent { 

    @Id 
    @GeneratedValue(generator="PersistentAuditEventGenerator") 
    @Column(name = "id") 
    private Long id; 
    //... 
} 

의 PostgreSQL은 IDENTITY 열을 지원하지 않는 ID 생성 전략을 변경하십시오.