ドキュメントを読んだ後でも、GoogleAppEngineのエンティティグループについて根本的な誤解があるようです。私の目標は、ORMの簡単な例です。部門に割り当てられた従業員がいます。従業員は1つの部門にのみ割り当てることができますが、部門には多くの従業員を含めることができます。それはあなたの標準的な1対多の関係です。
従業員のキー(電子メール)と部門名を指定して、従業員と部門の両方のオブジェクトを検索し、それらが存在しない場合は作成します。
以下は擬似コードであり、コンパイルするためのものではありません。コンパイルするコードを作成することが私を助けるのであれば、喜んでそうしますが、私の問題は概念的なものだと思います。
データオブジェクト:
@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!");
これは、GoogleAppEngineに移行する前に古い汎用ORMを使用していたときに完全に機能したロジックです。
ただし、GAEでは、次のような例外が発生します。
javax.persistence.PersistenceException:Employee( "bob@mycompany.com")をDepartment(14)の親として確立しようとしましたが、Department(14)によって識別されたエンティティはすでに親なしで永続化されています。オブジェクトが永続化されると、親を確立または変更することはできません。
従業員と部門を同じエンティティグループ(私が好む)にするためには、一方を他方の親にする必要があることを理解していますが、それらの関係は実際には親子に適合するものではありません私の心のパラダイム。
entityManager.getTransaction().begin()
との間でいろいろな部分を包んでみentityManager.getTransaction().end()
ましたが、無駄になりました。
従業員のキーの一部として部門のキーを含めることでこれを回避できます(したがって、部門を従業員の親にします)が、電子メールに基づいて従業員を検索し、どの部門に所属しているかを把握する方法がわかりません。または、逆に、特定の部門のすべての従業員を検索する方法。
これは意味がありますか?GAEでこの関係をどのように構築する必要がありますか?確かに、これは非常に一般的なパターンであり、私にはわかりにくい単純な解決策があります。
単純な多対1の外部キーをGAEのORMで簡単に表現できないのはかなりばかげているように思われるため、このパズルの基本的な部分には欠けているものがあると確信しています。
乾杯!