Google App Engine 上 JPA 中的简单一对多关系
Posted
技术标签:
【中文标题】Google App Engine 上 JPA 中的简单一对多关系【英文标题】:A Simple One-To-Many Relationship in JPA on Google App Engine 【发布时间】:2012-05-22 12:19:42 【问题描述】:即使在阅读the documentation 之后,我似乎对 Google App Engine 的实体组也存在根本性的误解。我的目标是 ORM 的一个简单示例:我将一些员工分配到部门。一个员工只能分配到一个部门,但一个部门可以有多个员工。这是标准的一对多关系。
给定员工的密钥(电子邮件)和部门名称,我想同时查找员工和部门对象,如果它们不存在,则创建它们。
以下是伪代码,并非用于编译。如果生成可编译的代码可以帮助您帮助我,我很乐意这样做,但我认为我的问题是概念性的。
数据对象:
@Entity
public class Department
private Key key;
private String name;
// getters and setters
@Entity
@NamedQuery(name="getEmployeesInDept", query="SELECT a from Employee a WHERE a.dept=:dept")
public class Employee
private Key key;
private String firstName;
@ManyToOne
private Department dept;
// getters and setters
查找或创建
Key employeeKey = KeyFactory.createKey("Employee", email);
Employee employee = entityManager.find(Employee.class, employeeKey);
if(employee == null)
Key deptKey = KeyFactory.createKey("Department", deptName);
Department dept = entityManager.find(Department.class, deptKey);
if(dept == null)
dept = new Department();
dept.setKey(deptKey);
dept.setName(deptName);
entityManager.persist(dept);
employee = new Employee();
employee.setKey(employeeKey);
employee.setFirstName(firstName);
employee.setDept(dept);
entityManager.persist(employee);
entityManager.close();
print("Found employee " + employee.getFirstName() + " from " + dept.getName() + " department!");
在我尝试迁移到 Google App Engine 之前,当我使用古老的通用 ORM 时,这就是完美的逻辑。
但是,在 GAE 上,我得到一个例外,例如:
javax.persistence.PersistenceException:检测到尝试建立 Employee("bob@mycompany.com") 作为 Department(14) 的父级,但 由 Department(14) 标识的实体已被持久化,但没有 家长。一旦对象具有父级,就不能建立或更改 被持久化了。
虽然我知道为了让 Employee 和 Department 进入同一个实体组(我更喜欢),我必须让其中一个成为另一个的父级,但他们的关系并不真正适合我心目中的亲子范式。
我曾尝试在entityManager.getTransaction().begin()
和entityManager.getTransaction().end()
之间包装各个部分,但无济于事。
我可以通过将 Department 的密钥包含在 Employee 的密钥中来解决这个问题(从而使 Department 成为 Employee 的父级),但是我不知道如何根据他们的电子邮件查找 Employee 并弄清楚他们是哪个部门' re in,或者相反,如何查找给定部门中的所有员工。
这有意义吗?我应该如何在 GAE 中构建这种关系?当然,这是一种非常常见的模式,它有一个让我难以理解的简单解决方案。
我确信我缺少这个难题的一些基本部分,因为在 GAE 的 ORM 中无法轻松表示简单的多对一外键似乎相当荒谬。
干杯!
【问题讨论】:
【参考方案1】:因此,如果它不适合拥有的关系,则将其设为无主,which is supported in v2.x of the GAE JPA plugin。
【讨论】:
链接失效以上是关于Google App Engine 上 JPA 中的简单一对多关系的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Google App Engine 文档强调 JDO 而不是 JPA?
在 Google-App-Engine 中使用 HSQLDB
如何在 Google Cloud App Engine 上使用 PubSub 创建订阅者,该订阅者通过 Publisher 从 Google Cloud App Engine Flex 收听消息?