3

アプリケーションに Symfony2 を使用しており、2 つのエンティティ マネージャーを使用しています。1 つは読み取り用で、もう 1 つは書き込み用です。

私はそのようなエンティティマネージャオブジェクトを作成しています:

$em = $this->getDoctrine()->getEntityManager('write');
$em = $this->getDoctrine()->getEntityManager('read');

最初は問題なく動作していましたが、現在、次のエラーが発生しています。

AppBundle\Entity\ProfileViewer#viewerエンティティの持続操作をカスケードするように構成されていない関係 ' ' を通じて新しいエンティティが見つかりました: shamsi。新しいエンティティを明示的に永続化するか、関係に対してカスケード永続化操作を構成します。

ここに私の ProfileViewer エンティティがあります:

/**
 * AppBundle\Entity\ProfileViewer
 *
 * @ORM\Table(name="profile_viewer")
 * @ORM\Entity
 */
class ProfileViewer
{
/**
 * @var bigint $id
 *
 * @ORM\Column(name="id", type="bigint", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

/**
 * @var bigint $userId
 *
 * @ORM\Column(name="user_id", type="bigint", nullable=false)
 */
private $userId;

/**
 * @var datetime $viewedAt
 *
 * @ORM\Column(name="viewed_at", type="datetime", nullable=true)
 */
private $viewedAt;

 /**
 * @ORM\ManyToOne(targetEntity="user", inversedBy="viewers")
 * @ORM\JoinColumn(name="viewer_id", referencedColumnName="id")
 */
private $viewer;

public function __construct()
{
    $this->viewedAt = new \DateTime();      
}
 /**
 * Get id
 *
 * @return bigint 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set userId
 *
 * @param bigint $userId
 */
public function setUserId($userId)
{
    $this->userId = $userId;
}

/**
 * Get UserId
 *
 * @return bigint 
 */
public function getUserId()
{ 
    return $this->userId;
}

/**
 * Set viewedAt
 *
 * @param datetime $viewedAt
 */
public function setViewedAt($viewedAt)
{
    $this->viewedAt = $viewedAt;
}

/**
 * Get viewedAt
 *
 * @return datetime 
 */
public function getViewedAt()
{
    return $this->viewedAt;
}

/**
 * Set viewer
 *
 * @param AppBundle\Entity\User $viewer
 */
public function setViewer(AppBundle\Entity\User $viewer)
{
    $this->viewer = $viewer;
}

/**
 * Get viewer
 *
 * @return AppBundle\Entity\User
 */
public function getViewer()
{
    return $this->viewer;
}

}

このエラーは、2 つのエンティティ マネージャーを作成したときに発生します。

4

1 に答える 1

7

デフォルトでは、Doctrine2でカスケードされる操作はありません。

関連付けに追加できcascade={"persist"}ます:

 /**
 * @ORM\ManyToOne(targetEntity="user", inversedBy="viewers", cascade={"persist"})
 * @ORM\JoinColumn(name="viewer_id", referencedColumnName="id")
 */

これを読んで、ドクトリンの関連付けに対するカスケード操作を理解できます。これは下線を引くことが重要です:

カスケード操作はメモリ内で実行されます。つまり、カスケード操作が実行されようとしているときにまだ遅延としてマークされている場合でも、コレクションと関連エンティティはメモリにフェッチされます。ただし、このアプローチでは、これらの操作ごとにエンティティ ライフサイクル イベントを実行できます。

ただし、オブジェクト グラフをカスケードでメモリにプルする と、特にカスケード コレクションが大きい場合に、かなりのパフォーマンス オーバーヘッドが発生する可能性があります。定義する各カスケード操作の利点と欠点を比較検討してください。

于 2012-08-29T15:03:25.920 に答える