2010-06-24 49 views
98

如何在休眠字段中設置默認值?如何在休眠中設置默認值

+3

您是否使用XML配置文件或註釋? – Bruno 2010-06-24 13:23:36

+1

下面的答案只給JPA解決方案,這是正確的,但對於Hibernate解決方案,請參閱http://stackoverflow.com/questions/28107554/define-default-column-value-with-annotations-in-hibernate你必須使用'@ ColumnDefault' – pdem 2016-09-20 07:25:49

回答

131

如果您想要真正的數據庫默認值,請使用columnDefinition - @Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")。請注意,columnDefinition中的字符串依賴於數據庫。此外,如果選擇此選項,則必須使用dynamic-insert,因此Hibernate不包括插入時帶有null值的列。否則談論違約是無關緊要的。

但是,如果你不想數據庫默認值,而僅僅是在Java代碼中的默認值,只是初始化變量這樣的 - private Integer myColumn = 100;

+5

帶註解:@ org.hibernate.annotations.Entity(dynamicInsert = true) – homaxto 2011-03-14 10:04:18

+4

目前'org.hibernate.annotations.Entity'已棄用。應該使用'@ DynamicInsert'註釋。 – jannis 2016-06-14 19:07:44

+0

我不推薦在這種情況下使用columnDefinition,這不是從數據庫到另一個數據庫的可移植性,您需要知道服務器的特定SQL語言。 – pdem 2016-09-20 07:30:33

23

只需爲該字段設置默認值,該怎麼辦?

private String _foo = "default"; 

//property here 
public String Foo 

如果他們傳遞一個值,那麼它將被覆蓋,否則,你有一個默認值。

+7

這並不會阻止某人在某個時刻將其設置爲空。 – michali 2014-10-21 11:17:11

+2

@michali:默認值的作用是不阻止更新值,是嗎? – 2016-09-12 11:16:19

5

一種解決方案是讓你的getter檢查,看是否任何價值您正在使用的是空(或任何其非初始化的狀態會),如果它是等於,只返回默認值:如果你想要做它在數據庫

public String getStringValue(){ 
    return (this.stringValue == null) ? "Default" : stringValue; 
} 
+0

我正在使用調用實體對象上的setter的映射器。在getter和setter上使用你的代碼片段有缺點嗎? – 2016-01-06 15:41:10

6

設置默認值UE在數據庫(SQL Server樣品):

ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME] 

映射休眠文件:

<hibernate-mapping .... 
    ...  
    <property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" /> 
    ... 

見,關鍵是插入= 「假」 更新= 「假」

+0

Oracle存在問題:如果該屬性不爲空,則其值仍爲默認值。不是實際值。 – youngzy 2016-01-19 08:18:17

19

您可以使用@ PrePersist anotation並在pre-persist階段設置默認值。

類似的東西:

//... some code 
private String myProperty; 
//... some code 

@PrePersist 
public void prePersist() { 
    if(myProperty == null) //We set default value in case if the value is not set yet. 
     myProperty = "Default value"; 
} 

// property methods 
@Column(nullable = false) //restricting Null value on database level. 
public String getMyProperty() { 
    return myProperty; 
} 

public void setMyProperty(String myProperty) { 
    this.myProperty= myProperty; 
} 

這種方法不依賴於數據庫類型/版本Hibernate的下方。默認值在持久化映射對象之前設置。

+0

由於'setMyProperty'沒有被你的例子使用。你爲什麼包括它? – EndermanAPM 2017-12-28 14:27:25

+0

我只給出了標準java屬性(使用public get/set方法的私有變量)的hibernate註釋示例。我注意到並糾正了一個錯誤...設置方法argumet的字符串類型丟失。 – dbricman 2018-02-27 15:36:25

5

以上提供使用休眠

@Column(name = 「myColumn」, nullable = false, columnDefinition = 「int default 100") 

設置默認值的解決方案是供應商特定的,並且不會爲Oracle工作。

+3

那麼哪個會對oracle有效? – dade 2014-11-18 13:22:35

+9

這應該是一個評論,而不是一個答案 – azerafati 2015-01-17 13:20:45

-3

上述建議有效,但前提是隻有在getter方法上使用註釋。如果在成員聲明的地方使用註釋,則不會發生任何事情。

public String getStringValue(){ 
    return (this.stringValue == null) ? "Default" : stringValue; 
} 
1
<property name="age" type="integer"> 
<column name="age" not-null="false" default="null" /> 
</property> 
+5

介意[解釋你的解決方案](http://stackoverflow.com/help/how-to-answer)有點?你可能想閱讀[我如何寫出一個好答案](http://stackoverflow.com/help/how-to-answer)。 – 2015-04-27 12:31:50

3

我搜索了這一點,並發現了許多答案爲column.If默認值要使用SQL表定義,那麼在@Column批註默認值使用「插入=假」 。如果您正在使用columnDefination它@Column批註可能它不會工作,因爲它取決於數據庫插入

@Column(名稱=列名,長度= lengthOfColumn,插入= FALSE)

0

與甲骨文合作,我試圖插入一個默認值枚舉

我發現下面的工作是最好的。

@Column(nullable = false) 
@Enumerated(EnumType.STRING) 
private EnumType myProperty = EnumType.DEFAULT_VALUE; 
2

您可以使用java類構造函數來設置默認值。例如:

public class Entity implements Serializable{ 
private Double field1 
private Integer field2; 
private T fieldN; 

public Entity(){ 
    this.field1=0.0; 
    this.field2=0; 
    ... 
    this.fieldN= <your default value> 
} 

//Setters and Getters 
... 

} 
2

使用@ColumnDefault()註釋。這只是休眠狀態。

1

使用Hibernate註釋

@ColumnDefault("-1") 
private Long clientId; 
+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/18356040) – Mamun 2017-12-27 00:55:13

0

如果你想設置在數據庫方面的默認值,只需設置@Column(columnDefinition = "int default 1")

但是,如果你打算什麼是你的Java應用程序,你可以設置默認值將其設置爲您的類屬性,如下所示:private Integer attribute = 1;