8

部門を含むデータベース テーブルがあります。人を含む別のテーブルがあります。ご想像のとおり、部門には多くの人が含まれており、人は 1 つの部門に所属しています。

新しい人をデータベースに保持したいときは、Person オブジェクトを作成し、その Department プロパティを、エンティティ マネージャーによって管理される既存のDepartment オブジェクトに設定しようとします。ただし、新しい Person を永続化しようとすると、例外が発生します。

エンティティの永続操作をカスケードするように構成されていない関係 'Entities\Person#department' を通じて、新しいエンティティが見つかりました: Entities\Department@0000000016abe202000000000d29dd37. この問題を解決するには: この不明なエンティティで明示的に EntityManager#persist() を呼び出すか、カスケードを構成してこの関連付けをマッピングで保持します (例: @ManyToOne(..,cascade={"persist"}))。

エンティティマネージャーを介して抽出したため、部門が「不明なエンティティ」であるという例外の部分を完全には理解していません。

例外が示すように、yml メタデータ ( ) にカスケードを挿入しましたcascade: ["persist"]。その後、私の人は保存されますが、部門テーブルに部門が複製され、新しいIDが作成されます。

これは非常に一般的な使用例です。コードとメタデータを以下に示します。どのような変更を加える必要がありますか?

メタデータ:

Entities\Person
  type: entity
  table: people
  fields:
    ...
    departmentId:
      type: integer
      unsigned: false
      nullable: false
      column: department_id
    ...
  manyToOne:
    department:
      targetEntity: Entities\Department
      joinColumn: department_id
      referenceColumnName: id

コード:

$department = $em->getRepository('Department')->findOneBy(array('name' => $departmentName);

$person = new Person();
$person->setName('Joe Bloggs');
$person->setDepartment($department);

$em->persist($person);
$em->flush();
4

1 に答える 1

11

この問題は、Entity Manager のさまざまなインスタンスを使用して最初に部門をフェッチし、次に Person を永続化したことが原因でした。

私のエンティティ マネージャはシングルトンになったので、エンティティ マネージャを要求するクラスが同じインスタンスを取得します。

于 2012-08-17T10:34:06.930 に答える