簡體   English   中英

為什么spring數據JPA中的關系屬性不能也final呢?

[英]Why can't we make a relationship attribute in spring data JPA final as well?

Owner 實體與 teacher 實體具有@ManyToOne - @OneToMany關系。 當我這樣注釋每個時

@Entity
public class Product {

... 

@ManyToOne(cascade = MERGE)
private final Owner owner;

另一方面,在所有者 Class 中,

@Entity 
public class Owner {

...

@OneToMany(mappedBy = "owner", cascade = MERGE)
private final List<Product> products;

現在發生的是mappedBy = "owner" "owner"紅色。 將鼠標懸停在它上面,我收到無法找到所有者屬性的錯誤。

錯誤:找不到反向屬性

解決方案是簡單地刪除產品 class 中屬性所有者中的final關鍵字。

它成為private Owner owner ,錯誤消失。 我不明白為什么添加關鍵字final會導致此問題。

為什么會這樣? 有解決方法嗎? 我還能將 owner 屬性設置為最終屬性嗎?

getgo 的主要想法是使產品 class 不可變。 雖然這是一個挑戰,但我已經設法找到了大多數事情的解決方法,但我不知道如何解決這個問題。

JPA 不支持不變性。 JPA 實體確實需要默認構造函數以及屬性的 getter 和 setter。 並且這些字段不能是最終的。

從技術上講,可以實現忽略最終屬性的 ORM,但為什么要這樣做呢?

關鍵字 final 表示:這在構造時被分配了一個值,之后永遠不會改變。 對於通過 no-args-constructor 構建然后在第二步填充的 JPA 實體來說,這是不正確的。

如果您正在尋找更好地支持不可變類的 ORM(具有 arguments 的構造函數,“枯萎”方法),您可能需要查看 Spring 數據 JDBC。

全面披露:我是 Spring 數據開發人員,負責 Spring 數據 JPA 和 Spring 數據 JDBC。

我認為您錯誤地理解了不變性概念。 不變性是 Java 語言強加的一個概念。 例如 String class 由於安全性、緩存等原因是不可變的。但在您的情況下, Product 是一個實體 class 並且如果您將它保存在持久層中,它本身已經是唯一的。 因此,即使您使產品 class 不可變,您將如何在兩次應用程序加載期間保持這種一致性? 如果您試圖使產品僅由一個所有者擁有,那么請進行數據庫檢查,而不是嘗試使其在 memory 中不可變。

暫無
暫無

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

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