[英]Objectify: How can I have a unique ID across several types?
我有幾種類型的具有一個公用字段(電子郵件ID),我將其用作@Id
。 這些類型是從具有電子郵件ID字段的普通用戶擴展而來的。 如下所示:
@Entity
class User{
@Id
String emailID;
}
@Entity
@Subclass(index = true)
class UserType1 extends User{
String otherField;
}
@Entity
@Subclass(index = true)
class UserType2 extends User{
String otherField;
}
現在,我希望每次插入用戶的子類型時,電子郵件ID在數據存儲區中的所有這些子類型對象中都應保持唯一。 我通過插入具有相同EmailID的每個子類型對上述類型的端點進行了測試,並且成功完成了-Objectify不應允許具有相同ID的子類型的持久性。 根據我的理解,鍵可以確保最終的唯一性,但是我不能僅通過子類型的Id來確保唯一性,尤其是當ID在基類中時嗎? 有什么辦法嗎?
編輯:雖然,這不是我一直在尋找的解決方案,但是我已經通過使用{EmailID,Key_Subtype}創建一個新的實體類型來處理這種情況,以確保唯一性。 我只是在此實體中檢查現有的emailID,然后使用該鍵通過另一個查詢來檢索該對象。
如果有人提出更好的解決方案,我將不勝感激。
UUID是您要尋找的。 它是為每個實體生成的。 類型沒關系。
在數據存儲級別肯定可以為不同的實體類型使用相同的Id
,請參見將實體的ID重新用於其他不同類型的實體-理智的想法?
Id
唯一性僅在相同類型且具有相同父實體的實體之間得到保證 (唯一實體關鍵字基於這三個項目的組合)。 由於您的子類型實際上是不同的實體類型,因此在這些類型中使用相同的Id
毫無問題,因此子類化不是實現所需內容的方法。
要具有唯一的Id
您需要具有唯一的實體類型,例如User
。 為了區分不同的用戶類型,可能在User
內部具有type
屬性,該屬性是對UserTypeX
類型的實體的引用,其中包含該用戶類型的特定信息?
聽起來您已經找到了“正確的”解決方案-創建一個使用電子郵件地址作為id並包含指向相應User
實體的指針的Email
實體。 創建新的“ User
/ Email
,請始終檢查交易中電子郵件地址是否存在。
實際上,這與直接使用電子郵件地址作為User
的ID沒有什么不同,除了間接層允許用戶更改其電子郵件地址外,這通常是一個好主意。 兩種情況下的事務邏輯都是相似的。
事務性查找和創建具有自然主鍵的實體幾乎是保證數據存儲區唯一性的唯一方法。 它是有效且可擴展的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.