2017-03-21 6 views
1

PostgreSQL 데이터베이스에서 값이 기본값으로 설정된 여러 매개 변수가있는 JPA/EclipseLink 모델이 있습니다. 특히, 내가 가진 :JPA로 INSERT에서 열 건너 뛰기

  • 유형 SERIALid 열하는 자동 증분을 새로운 행 내 모델은 다음과 같습니다
  • 유형 TIMESTAMPcreated_at 열하는 기본값

now()에 추가 될 때 :

import javax.persistence.*; 

@Entity 
@Table(name="entity") 
@NamedQuery(name="Entity.findAll", query="SELECT e from Entity e") 
public class Entity { 
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id; 

    @Column(name="created_at") 
    private java.sql.Timestamp createdAt; 

    // constructor, getters, and setters 
} 

행을와 함께 삽입하려고하면 값이 created_at 열에 대해 NULL 값으로 설정되어 있기 때문에 삽입이 실패합니다. NULL을 삽입하기보다는 단순히 그 열에 아무것도 삽입하지 않고 PostgreSQL이 now()으로 설정할 수 있도록하고 싶습니다. 본질적으로 createdAt@GeneratedValue을 사용하고 싶지만이 주석은 기본 키에만 적용되며 여러 속성에 사용할 수 없습니다. 이 작업을 수행하는 데 사용할 수있는 또 다른 주석이 있습니까?

+0

어쩌면 이것이 당신이 찾고있는 것입니다 : http://stackoverflow.com/questions/8202154/how-to-create-an-aut-generated-date-timestamp-field-in-a-play-jpa – Spasoje

답변

2

당신은 Column 주석에 insertable=false을 할 수 있습니다 :

@Column(name="created_at", insertable=false) 
private java.sql.Timestamp createdAt; 

에서 : http://docs.oracle.com/javaee/5/api/javax/persistence/Column.html

부울 삽입 가 열이 지속성에 의해 생성 된 SQL의 INSERT 문에 포함되는지 여부 (선택 사항)

을 제공
+0

정확히 필요한 것, 감사합니다! – Ecliptica

1

또 다른 대답에서 언급했듯이 JPA prov iders는 insertable = true (기본값)로 표시된 경우 insert의 값을 설정합니다. 이는 문 재사용을 허용하기 때문에 null이더라도 많은 제공자에서 발생합니다.

엔티티 (및 캐시)의 값을 새로 고침해야하므로 성명에서 제외하면됩니다. 그러나 EclipseLink는 @ReturningInsert을 가지고있어서 EclipseLink가 엔티티를 데이터베이스의 값으로 업데이트 할 수 있습니다. 불행히도 오라클 만 지원합니다. 다른 데이터베이스는 삽입 실행을 반환하고 값을 반환하기 위해 저장 프로 시저를 사용해야합니다.