2012-05-22 6 views
0

최대 절전 모드를 사용하여 Postgres 데이터베이스에 연결 중입니다. 데이터베이스에는 레코드가 해당 테이블에 삽입 될 때 현재 시간을 저장하도록 열 중 하나가 설정되는 테이블이 있습니다. Postgres 인터페이스에서 레코드를 삽입하면 현재 시간이 자동으로 채워집니다.Postgres 데이터베이스 테이블의 열이 자동으로 채워지지 않습니다.

그러나 최대 절전 모드에서 레코드를 삽입하려고하면 레코드가 현재 시간 열에 데이터베이스에 자동으로 삽입되지 않습니다.

Query dateQuery=session.createQuery("select b.boilerPlateContent from Boiler_Plates b join b.bt_contracts c where c.contractId=:val order by b.boilerPlateContent desc)").setEntity("val",ct); 
Iterator dateIterator = dateQuery.list().iterator(); 
String latestBoilerPlate=(String)dateIterator.next(); 
System.out.println(latestBoilerPlate); 
Pattern p=Pattern.compile("\\d+"); 
Matcher m=p.matcher(latestBoilerPlate); 
while(m.find()){ 
lastEntered=m.group(); 
nextBoilerPlateNumber=Integer.parseInt(m.group()); 
} 
nextBoilerPlateNumber++; 
Boiler_Plates bp=new Boiler_Plates(); 
bp.setBoiler_plate_id(boilerPlateId); 
boilerPlateText="bp"+nextBoilerPlateNumber; 
bp.setBoilerPlateContent(boilerPlateText); 
bp.setBoilerPlateName("Test"); 
//bp.setInsertTime(); 
bp.setContract(ct); 
session.save(bp); 
tx.commit(); 

답변

2

감사를 시도하는 것 같습니다. 이를 위해 매우 잘 정립 된 솔루션이 있습니다. envers, trigger examples on the PostgreSQL wiki 및 JPA 감사 지원 @PrePersist, @PreUpdate, and entity listeners을 참조하십시오. @Embeddable 엔티티와 @EntityListener를 사용하면 감사 코드를 다시 사용할 수 있습니다.

열이 자동으로 설정되는 방법을 지정하지 않았습니다.

DEFAULT를 설정했다면 Hibernate는 INSERT의 모든 열에 값을 지정하여 DEFAULT가 사용되지 않도록합니다. 열을 설정하지 않거나 열 값으로 명시 적으로 DEFAULT 키워드를 지정하려면 Hibernate를 가져와야합니다. insertable = false, updatable = false로 매핑하여이 작업을 수행 할 수 있습니다. 또는 Hibernate가 직접 원하는 값을 삽입 할 필요가있다.

또 다른 옵션은 ON INSERT FOR EACH ROW 트리거를 사용하여 열의 값을 설정하는 것입니다. 이를 통해 누군가가 INSERT 할 때 열에 대해 지정하는 것과 상관없이 PL/PgSQL에서 값을 설정할 수 있습니다.

여기에 another entity listener example입니다.

+0

당신의 답은 제가이 문제를 해결하는 데 도움이되었습니다. 속성에 삽입 속성을 false로 설정하면 잘 작동합니다. <속성 이름 = "insertTime"type = "날짜"insert = "false"> <열 이름 = "insert_time_stamp"/> – Alok

0

이미 지적했듯이 초기 질문의 정보는 거의 부족합니다. 그러나 "현재 시간은 레코드를 삽입 할 때 자동으로 채워집니다"라고 가정하면 해당 열에 DEFAULT가 정의되어 있다고 가정합니다. DEFAULT 값은 해당 열이 insert 문에서 참조되지 않을 때만 적용됩니다. Hibernate는 기본적으로 insert 문에있는 모든 컬럼을 참조 할 것이다. 그러나 해당 동작을 변경할 수 있습니다. 다음은 내 생각이 매핑 같은 뭔가를 찾고있다 :

@Entity 
public class Boiler_Plates { 
    ... 
    @Temporal(TemporalType.TIMESTAMP) 
    @Generated(GenerationTime.INSERT) 
    @Column(insertable = false) 
    Date insertTime 
} 

@Column을 (= false를 삽입) INSERT 문에서이 열을 포함하지 않도록했다. @ Generated (GenerationTime.INSERT)는 생성 된 값을 찾기 위해 INSERT가 실행 된 후 해당 열의 상태를 다시 읽습니다.

관련 문제