教义自定义存储库方法和非托管实体

Posted

技术标签:

【中文标题】教义自定义存储库方法和非托管实体【英文标题】:Doctrine custom repository methods and unmanaged entities 【发布时间】:2014-03-26 15:37:35 【问题描述】:

我有自定义实体存储库(比如说CategoryRepository),它返回 Doctrine 实体。我也有新创建的实体(比如说Product),我想坚持。 产品与类别相关,在这种情况下,产品是关系的拥有方,所以我有以下代码:

$category = $categoryRepository->customGetCategory($someCriteria);
$product = new Product();
$product->setCategory($category);
$em->persist($product);

结果是

[学说\ORM\ORMInvalidArgumentException] 通过关系发现了一个新实体 'Acme\SomethingBundle\Entity\Product#category' 未配置 级联实体的持久操作:blahblah。为了解决这个 问题:在这个未知数上显式调用 EntityManager#persist() 实体或配置级联在映射中保留此关联 例如@ManyToOne(..,cascade="persist")

现在我知道,使用\Doctrine\ORM\Query::getResult() 方法返回的自定义存储库方法返回的所有实体,其中查询对象由EntityManager::createQuery($dql) 工厂方法返回,默认情况下都是分离的。所以我得到了存在于数据库中的存储库返回的实体,我找不到一种方法来管理它,就像 f 返回的任何实体一样。前任。 $repository->findBy() 方法。

谁能指出我正确的方向?我真的很想解决这个问题,这让我很生气。

【问题讨论】:

能否请您发布您的类别和产品实体? (只有它们之间关系的代码sn-ps) 【参考方案1】:

这可能是被问到的 5 个最重要的教义问题之一。只是很难搜索。可以尝试搜索错误消息。

问题是 Category::setProduct 永远不会被调用。更新您的 Product 实体:

class Product

    public function setCategory($category);
    
        $this->category = $category;
        $category->setProduct($this); // *** Add this
    

【讨论】:

以上是关于教义自定义存储库方法和非托管实体的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 和非托管 C++ 之间传递自定义对象

ZF2 Doctrine - 使用查询构建器如何指向存储库中的自定义方法

具有连接的实体和存储库中的教义可重用标准

实体框架代码第一个自定义Id

Nest js 和 typeorm 自定义存储库问题

无法使用自定义 Spring 引导库中的类