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 收听消息?

在 Google App Engine 上部署 create-react-app

从 Google App Engine 发送请求

在 Google App Engine 上运行 Alembic 迁移