奇怪的错误"通过这种关系找到了一个新的实体"在Symfony关于生产环境

时间:2015-08-19 14:37:26

标签: mysql symfony doctrine entity

我对Doctrine常见错误感到奇怪:

CRITICAL: Uncaught PHP Exception Doctrine\ORM\ORMInvalidArgumentException: "A new entity was found through the relationship 'Isc\CoreBundle\Entity\Orders#ordersProducts' that was not configured to cascade persist operations for entity: Isc\CoreBundle\Entity\OrdersProducts@000000000888648200000000198a79af

奇怪的是错误频率。我们可以使用该编程代码处理5000个订单,一切都会正常工作。但是第5001个订单会产生这个错误,我们不会保存订单产品。

我用google搜索解决方案,但我找到的所有内容(例如Doctrine - A new entity was found through the relationshiphttps://groups.google.com/forum/#!topic/doctrine-user/bdY1QgM4Tu4等)都没有帮助我。

此外,在生产环境中发生了许多服务器的错误。在具有一台服务器的开发人员环境中,它运行良好。

在日志中它看起来像(用户总是有一个会话ID):

  • www1 - 访问过的产品页面
  • www1 - 在购物车中添加了product1
  • www2 - 在购物车中添加了产品2
  • www7 - 访问过的购物车
  • www2 - 选择付款Paypal
  • www2 - 初始化订单(并使用orderProducts将其保存在db中)
  • www4 - 将数据发送到PayPal并将用户重定向到付款
  • www3 - 从Paypal获取有关付款的请求 - 尝试更新订单和订单产品 - 此处生成的例外

有没有人遇到与Doctrina类似的问题? 这可能是因为我们使用的服务器很少吗?

" good"的编程代码订单和"坏"永远相同

P.S。 php5.4; Symfony2的; MySQL的

2 个答案:

答案 0 :(得分:1)

如果生产服务器上发生错误而非其他服务器发生错误,我认为您的生产服务器上有不同版本的MySQL。

如果每台服务器上都有相同的MySQL版本,请尝试在生产服务器上进行编辑器更新,然后在开发服务器上进行更新。

但是,你必须解决这个问题。 该错误表示通过您的订单#ordersProduct找到了一个新实体。

要解决此错误,您有两种解决方案:

1) - 使用cascade={"persist"}

将新实体保留在您的操作中

2) - 在您的实体(孩子或父母,我不知道您正在使用哪种关系)的映射中添加String code = "<div> style="width: 3%" </div>"

这应解决元素n°5001的问题,并防止5000个先前元素的错误。

请参阅Doctrine - Working with associations

答案 1 :(得分:0)

我有一种奇怪的感觉,这可能是数据库相关的问题。如果您尚未将实体的关系配置为cascade=persist,则通常会抛出您收到的例外情况。但我怀疑是这样的。

根据您的说法,在我看来,您可能拥有2个数据库(即主服务器和从服务器)。如果是这种情况,那么当您最终到达www2 - initialized order (and saved it in db with orderProducts)时,您的奴隶可能无法完美同步。因此,您最终有一个包含已保存的Order和1个从属的奴隶,其中Order缺失(尚未同步)。当您尝试对Product执行操作时,它与尚未插入当前从属的Order关联,因此您会收到该异常消息。

可能有用的是设置双向cascade=persist

  1. Order->productsCollection
  2. Product->order
  3. 虽然我不确定这是否会导致数据库失去同步。(如果有多个数据库就是这种情况)