2015-09-08 152 views
2

正如我們可以讀到的here Hibenate對於所有的@Entity類都需要no-arg構造函數。但是,即使我們沒有明確地聲明一個,java類總是隱式默認構造函數是不是真的?休眠和無參數構造函數

在我的項目中,我沒有在我的@Entity類中聲明無參數構造函數,並且eveything正常工作。但另一方面,我想Hibernate規範已經被仔細地寫過了,所以也許實際聲明默認的構造函數可能有一些好處?

回答

3

明確定義無參數的構造爲實體類的沒有什麼特別的好處(但是請記住,Hibernate框架內部使用無參數的構造通過Java反射API來填充實體)。

這是強制性的,Hibernate的實體bean類需要無參數的構造函數,可以明確地由程序員(或自動通過Java的產生)來定義。

很重要的一點是,當你定義自己的類構造函數(S),你需要自行提供無參數的構造(因爲編譯器不會在這種情況下提供)。

8

如果您創建其他構造函數,java將不會創建隱式構造函數。

0

Java類可能沒有隱式默認構造函數。 假設,你有這樣一類:

public class A { 
    public A(String st) {} 
} 

最終,唯一的構造將是A(線St),而不是A(線St)和A()。

2

在Hibernate中,無參數的構造是通過反射來裝載數據庫實體(即用於檢查或在運行時修改應用行爲)。

2

執行默認無參數構造函數並非強制即使對於Hibernate,因爲java會自動隱式地管理它。

並且當您聲明另一個參數化構造函數時,您需要指定它的唯一情況是

如果你看一看The No-Arg Constructor,你會發現:

每個班級至少有一個構造函數。有兩種情況:

  1. 如果你不寫一個構造一類,Java的生成 你一個 。這個生成的構造函數被稱爲默認構造函數。這是 在您的代碼中不可見,但它在那裏是一樣的。如果你能看到 它,它看起來像這樣(爲類犬): 公狗(){}注意,這個默認的構造函數沒有參數,對身體,什麼也不做。

  2. 如果您爲您的類編寫構造函數,Java不會生成默認構造函數 a 。如果您有預先存在的 使用默認構造函數的代碼,則可能會出現問題。

2

如果不定義任何構造函數,編譯器將生成默認的,如JLS描述:如果一個類不包含任何構造函數聲明,則將默認

沒有正式參數且沒有拋出子句的構造函數是隱式聲明的 。

如果聲明的類是原始類Object,則默認構造函數具有空的主體。否則,構造函數的默認構造函數只會調用沒有參數 的超類構造函數。

這意味着,你不必,只要明確實施一個Hibernate實體的無參數的構造函數:

  1. 您不必在實體類中的任何其他構造;
  2. 對於任何檢查的異常,擴展超類都有一個無參數構造函數,沒有throws子句。
+0

+ for the 2nd。異常將被拋出,因爲在擴展時,super()被調用哪個ofc調用no-arg構造函數 – pzeszko