JPA按键搜索而不知道父密钥

时间:2014-04-16 23:29:51

标签: google-app-engine jpa google-cloud-datastore

好的,我有一个使用GAE并因此使用数据存储区的应用程序。

假设我有多家公司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表示期间。有时候我需要生成一个报告,或者打开一个Employees个人资料,在这种情况下,包含他的信息的div将获得如下id:

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

并且这个div有一个onclick / submit事件,它会将对员工配置文件的新修改转换为servelet,此时我必须指定员工的主键,(我认为我可以轻松地从div id),但它没有在服务器端工作。

问题是我知道Key的Employees String部分和长部分,但不知道Parent键。为了节省时间,我尝试了这个并且它没有工作

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

X始终返回null。

我真的很感激如何找到或者&#34;查询&#34;密钥实体不知道父母密钥(因为我不想重新调整实体类)

非常感谢!!

1 个答案:

答案 0 :(得分:1)

实体密钥及其父母不能分开。它被称为祖先路径,是由实体种类和ID组成的链。

因此,在您的示例中,祖先路径将如下所示:

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

仅由(&#34; Employee&#34;,5630599045840896)组成的密钥与EmployeeKey完全不同,即使两个密钥都以相同的值结尾。可以考虑将元素连接成一个&#34;字符串&#34;并且比较最终值,它们永远不会匹配。

您可以做的一件事是使用编码键而不是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 doc: https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/KeyFactory#keyToString(com.google.appengine.api.datastore.Key)