2014-04-16 120 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

是的!那就是诀窍!非常感谢 !! –