簡體   English   中英

初始化JPA實體getter中的字段是一種好習慣嗎?

[英]Is it good practice to initialize fields inside a JPA entity getter?

在POJO Java bean中,這樣的代碼可能是有益的,尤其是對於集合:

class POJO {
    private Collection<X> col;

    public Collection<X> getCol() {
        if (col == null)
           col = new SomeCollection<X>();

        return col;
    }
}

它使得使用POJO的代碼可以調用pojo.getCol().isEmpty()而無需額外的空檢查,從而使代碼更清晰。

假設POJO類是JPA實體,它仍然可以安全嗎? 通過將集合從null初始化為空的集合,持久性數據將不會被更改,但是,我們仍在修改對象,因此持久性提供程序可能會在刷新持久性上下文時產生一些副作用。 我們有什么風險? 便攜性可能嗎?

我認為這不是一種好的做法,更像是一些很少需要的優化。 如果SomeCollection的創建非常繁重,也許懶惰的初始化是有意義的。 相反,你可以在聲明時初始化它(代碼更清潔至少對我來說):

class POJO {
    private Collection<X> col  = new SomeCollection<X>();

    public Collection<X> getCol() {
        return col;
    }
}

在刷新或可移植性問題中沒有副作用,並且您有一個空檢查更少。

我強烈反對ORM實體中屬性的延遲初始化。

當使用Hibernate進行實體屬性的延遲初始化時,我們遇到了一個嚴重的問題,所以我強烈反對它。 我們看到的問題表現在我們發出搜索請求時發生的保存。 這是因為當加載對象時屬性為null,但是當調用getter時它將返回延遲初始化對象,因此hibernate(正確地)將對象視為臟對象並在發出搜索之前將其保存。

一般來說,最好使用空集合或null(對於集合的字段)。

但我不推薦你在吸氣器中的方式。

在我個人看來,上面的“規則”也應該用於對象的內部表示。 所以你做得更好:

class POJO {
    private Collection<X> col  = new SomeCollection<X>();

無論如何,如果你想要更多的保存,你需要保護你更新col引用的每一種方式。 但在JPA應用程序中,這應該是一個非常原始的用例。

延遲初始化非常常見且很好。

在構造函數或變量定義中進行權衡與初始化:

  • 延遲初始化通常更有效,它延遲了創建值的成本,這可能永遠不需要或用其他值替換。 這在JPA中非常常見,其中從數據庫中讀取現有對象,並且始終替換它們的值。
  • 它允許空值具有意義,這在布爾值中更為典型,其中null表示基於在創建時不知道的其他內容而延遲分配的默認值。
  • 如果值是暫時的或者是某些方法,則延遲初始化可以防止空指針。

精讀

  • 如果直接訪問該字段,您仍然可以獲得空指針。
  • 在變量定義中設置默認值更加清晰。
  • 如果同時使用該對象,則延遲初始化可能是並發問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM