2012-05-22 25 views
0

我正在使用hibernate連接到Postgres數據庫。在數據庫中有一個表,其中一列被設置爲存儲將該記錄插入該表中的當前時間。當我從Postgres接口插入記錄時,當前時間會自動填充。Postgres數據庫表中的列未自動填充

但是,當我嘗試從Hibernate插入記錄時,記錄不會被數據庫自動插入到當前時間列中。

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將不被使用。您需要讓Hibernate避免設置列或明確指定關鍵字DEFAULT作爲列值 - 您可以通過將其映射爲insertable = false,updatable = false來完成此操作。或者,你需要讓Hibernate直接插入你想要的值。

另一種選擇是使用觸發器來設置列的值。這可以讓你設置來自PL/PgSQL的值,而不管在INSERT時間什麼人爲該列指定的值。

這是another entity listener example

+0

您的回答幫助我解決了這個問題。我將屬性中的插入屬性設置爲false,並且運行良好。 Alok

0

正如已經指出的那樣,您最初的問題中的信息非常缺乏。但是,假設「插入記錄時自動填充當前時間」意味着您在該列上定義了DEFAULT,則只有在插入語句中未引用該列時,DEFAULT值纔會生效。 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執行後重新讀取該列的狀態以查找生成的值。