2014-04-16 170 views
0

好吧,我有一個應用程序使用GAE,因此數據存儲。JPA通過密鑰搜索而不知道父密鑰

假設我有多家公司A,B,C和我在每家公司內都有員工X,Y和Z.公司和員工之間的關係將是OneToMany,公司是業主。這導致公司主要是形式

long id = 4504699138998272; // Random Example 
Key CompanyKey = KeyFactory.createKey(Company.class.getSimpleName(), id); 

和僱員關鍵的是形式

long id2 = 5630599045840896; 
Key EmployeeKey = KeyFactory.createKey(CompanyKey,Employee.class.getSimpleName(),id2); 

一切優秀和良好的,並沒有任何問題,直到在前端,中jsp表示。有時候,我需要生成報表,或打開一個員工的個人資料,在這種情況下,包含了信息的股利如下

<div class="employeeInfo" id="<%=employee.getKey().getId()%>" > .....</div> 

,這div有一個onclick將獲得一個ID /提交事件,將阿賈克斯對僱員配置文件進行新的修改,在這一點上,我必須指定僱員的主鍵(我認爲我可以很容易地從div id獲得),但它並不適用於服務器端。

問題是我知道密鑰的僱員字符串部分和長部分,但不是父鍵。爲了節省時間,我試了這個,它沒有工作

Key key = KeyFactory.creatKey(Employee.class.getSimpleName(); id); 
Employee X = em.find(Employee.class,key); 

X總是返回null。

我會很感激的如何找到或鍵「查詢」實體的任何想法不知道他們的父母鍵(因爲我不想不得不重新調整實體類)很多

謝謝!

+0

ofcourse我可以將公司的長ID添加到div id並重建兩個密鑰,但我有一種感覺,這樣做有更好的方法。另外,我不認爲我應該在HTML中發佈主鍵,所以有人可以請告訴它應該怎麼做!非常感謝 !! –

回答

1

實體鍵及其父母不能分開。它被稱爲祖先路徑,一個由實體種類和ID組成的鏈。

所以,在你的榜樣祖先的路徑將是這樣的:

  • CompanyKey:("Company", 4504699138998272)
  • EmployeeKey:("Company", 4504699138998272, "Employee", 5630599045840896)

只組成的密鑰( 「僱員」,5630599045840896)是與EmployeeKey完全不同,即使兩個鍵都以相同的值結束。考慮將元素連接成單個「字符串」並比較最終值,它們將永遠不會匹配。

一兩件事你可以做的是使用編碼鍵,而不是他們的ID值:

String encodedKey = KeyFactory.keyToString(EmployeeKey); 
Key decodedKey = KeyFactory.stringToKey(encodedKey); 
decodedKey.equals(EmployeeKey); // true 

更多關於祖先路徑: https://developers.google.com/appengine/docs/java/datastore/entities#Java_Ancestor_paths

的KeyFactory Java文檔: https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/KeyFactory#keyToString(com.google.appengine.api.datastore.Key)

+0

是的!那就是訣竅!非常感謝 !! –