2010-08-05 38 views
2

我有個域對象和註解如下休眠註解,指定列的默認值

@Entity 
@Table(name = "REQUEST") 
public class Request { 

    /** 
    * Unique id for this request 
    */ 
@Id 
@GeneratedValue 
@Column(name = "EQ_ID") 
private long requestId; 
/** 
* 
*/ 
@Column(name = "EMAIL_ID") 
private String emailId; 
/** 
* 
*/ 
@Column(name = "REQUEST_DATE") 
private Date requestDate; 
/** 
*Getters/setters omitted 
*/ 
} 

REQUEST_DATE不能爲空並且每DDL的默認值是SYSDATE(Oracle數據庫)。如何註釋此字段,以便如果requestDate屬性爲null,hiberanate會自動插入sysdate。目前它在該字段爲空時拋出錯誤,這非常明顯,因爲根據數據庫約束它不能爲空。我如何去做這件事? 一種替代方法是將此字段標記爲瞬態,並且插入正常工作。但是消極的一面是,我將無法檢索request_date列的值。

回答

7

這是hibernate註釋中缺少的功能。 Yok發佈了一些解決方法。問題是,解決方法是依賴於供應商,可能不適用於所有數據庫。在我的情況下,甲骨文,它不工作,並已被報告爲一個錯誤。

3

指定一個默認值字段:

private Date requestDate = new Date(); 
+2

這是一個Web應用程序。上面的代碼將插入與sysdate不同的服務器時間(假設appserver和db在diff時區中)。同樣的代碼將在不同的開發服務器上運行,但都指向相同的數據庫實例。 – chedine 2010-08-05 09:53:25

+0

@chedine:如果你有特定的限制,爲什麼不在問題中添加它們?你會更好的答案,人們不會浪費他們的時間建議一些不符合你的限制的東西... – 2010-08-05 10:00:20

+0

可能是我的錯。無論如何,謝謝你的時間。 – chedine 2010-08-05 10:03:39

8

你可以把默認值在columnDefinition。一個例子是這樣的:

@Column(name = "REQUEST_DATE", nullable = false, columnDefinition = "date default sysdate") 
+0

我已經試過了。 @Column(name =「REQUEST_DATE」,columnDefinition =「DATE DEFAULT sysdate NOT NULL」)。它不起作用。 – chedine 2010-08-05 09:57:03

+0

@chedine:請在您的問題中提及您已經嘗試了什麼,以及爲什麼它不適合您。看到我的其他評論爲這背後的理由。 – 2010-08-05 10:01:05

+0

@chedine:它拋出了什麼錯誤?當你使用類似於我的解決方案時。因爲我使用這個,不要面臨任何問題。 – YoK 2010-08-05 10:13:03

0

使Oracle中的默認列SYSDATE:

ALTER TABLE APP MODIFY (REQUEST_DATE DEFAULT SYSDATE);

然後,從Hibernate的角度來看,它可以爲空。

Hibernate會將NULL保存到數據庫中。 Oracle會將其轉換爲SYSDATE。每個人都會很開心。

+0

這就是現在這樣。但是當我嘗試插入requestdate = null的對象時,我得到一個異常。導致:java.sql.BatchUpdateException:ORA-01400:不能將NULL插入(「DBINST」。「APP」。「REQUEST_DATE」) – chedine 2010-08-05 10:09:43

+0

如果從SQL * Plus運行相同的INSERT或其他東西,它是否工作或給你那個錯誤? – 2010-08-05 10:40:04

+0

相同的錯誤「無法插入空白」。 – chedine 2010-08-05 11:04:43

0

我解決了給這個變量分配一個值private Integer active = 0;

@Entity 
@Table(name="products") 

public class ServiziTipologia { 

    @Id 
    @GeneratedValue 
    private Integer id; 
    private String product; 
    private String description; 
    private Integer active= 0; 
1

使用@ColumnDefault(適用於DDL更新)。 hibernate.hbm2ddl.auto =更新

import org.hibernate.annotations.ColumnDefault; 

.... 

@ColumnDefault(value="'@'") 
@Column(name = "TEMP_COLUMN", nullable = false) 
public String getTempColumn() { 
    return tempColumn; 
} 

DDL生成:

Alter Table YOUR_TABLE add TEMP_COLUMN varchar2(255) default '@' not null;