好的,我有一个使用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;密钥实体不知道父母密钥(因为我不想重新调整实体类)
非常感谢!!
答案 0 :(得分:1)
实体密钥及其父母不能分开。它被称为祖先路径,是由实体种类和ID组成的链。
因此,在您的示例中,祖先路径将如下所示:
("Company", 4504699138998272)
("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)