【问题标题】:JPA search by Key without Knowing Parent KeyJPA 在不知道父键的情况下按键搜索
【发布时间】:2014-04-16 23:29:51
【问题描述】:

好的,我有一个使用 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表示期间。有时我需要生成报告,或打开员工个人资料,在这种情况下,包含他的信息的 div 将获得如下 id

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

并且这个 div 有一个 onclick/submit 事件,它将对员工个人资料的新修改 ajax 到 serverlet,此时我必须指定员工的主键,(我认为我可以很容易地从div id),但它在服务器端不起作用。

问题是我知道键的员工字符串部分和长部分,但不知道父键。为了节省时间,我尝试了这个,它没有工作

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

X 总是返回 null。

对于如何在不知道其父键的情况下通过键查找或“查询”实体的任何想法,我将不胜感激(因为我不想重新调整实体类)

非常感谢!!

【问题讨论】:

  • 当然我可以将公司长 id 添加到 div id 并重建两个键,但我觉得有更好的方法来做到这一点。另外,我不认为我应该在 html 中发布主键,所以有人可以请教应该怎么做!非常感谢!!

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


【解决方案1】:

实体键和它的父级不能分开。它被称为祖先路径,由实体种类和id组成的链。

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

  • 公司密钥:("Company", 4504699138998272)
  • 员工密钥:("Company", 4504699138998272, "Employee", 5630599045840896)

EmployeeKey 相比,仅由 ("Employee", 5630599045840896) 组成的键是完全不同的,即使两个键以相同的值结尾。考虑将元素连接成一个“字符串”并比较最终值,它们永远不会匹配。

您可以做的一件事是使用编码键而不是它们的 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多