【问题标题】:Cascade persisting issues with Doctrine2 and Symfony2Doctrine2 和 Symfony2 的级联持续问题
【发布时间】:2012-08-29 14:57:44
【问题描述】:

我正在为我的应用程序使用 Symfony2,并且我正在使用两个实体管理器;一个用于读取,另一个用于写入。

我正在创建这样的实体管理器对象:

$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;
}

}

当我创建了两个实体管理器时出现此错误。

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    默认情况下,没有操作级联在 Doctrine2 中。

    您可以将cascade={"persist"} 添加到您的关联中:

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

    您可以阅读this 以了解学说中关联的级联操作。强调这一点很重要:

    级联操作在内存中执行。这意味着收藏和 相关实体被提取到内存中,即使它们仍然存在 级联操作即将执行时标记为惰性。 然而,这种方法允许执行实体生命周期事件 对于这些操作中的每一个。

    但是,在级联时将对象图拉入内存可能会导致 相当大的性能开销,尤其是在级联时 馆藏很大。确保权衡优点和缺点 您定义的每个级联操作。

    【讨论】:

    • 我已经进行了更改,但现在出现以下错误 SQLSTATE[23000]:完整性约束违规:1062 Duplicate entry 'shamsi' for key 'UNIQ_8D93D64992FC23A8' ....
    • 您需要在关联的另一端执行相同的操作。 OneToMany 方面。
    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多