当前位置: 首页 > 知识库问答 >
问题:

symfony2中的刷新错误

盛浩阔
2023-03-14

自从我尝试使用attribute处理多对多关系以来,已经有相当长的一段时间了。

我重新检查了实体,表格...一切看起来都很好。仍然有错误:

这种关系是这样建立的:书

嵌套表单允许创建书籍,从中创建具有年份属性的作者。

到目前为止,我只是试图记录新作者,以便在处理与一本书的关系之前让他们存在。

这是我的代码:

foreach ($book->getAuthorBooks() as $authorBook) {
   $AuthorUrlname = $this->mu->generateUrlname( $authorBook->getAuthor()->getFirstname().'-'.$authorBook->getAuthor()->getLastname() );

   // If the author does not exist yet, it is added to the database:

   $checkAuthor = $this->em->getRepository('cmdMyBundle:Author')->findOneByUrlname($AuthorUrlname);

   if ($checkAuthor == null) {                  
        // Author does not exist
        $newAuthor = new Author();
        $newAuthor->setLastname($authorBook->getAuthor()->getLastname());
        $newAuthor->setFirstname($authorBook->getAuthor()->getFirstname());
        $newAuthor->setUrlname($AuthorUrlname);
        $newAuthor->setCollection($this->collection);
        $this->em->persist($newAuthor);
        $this->em->flush();

    }else{
        // Author already exists
    }

}// foreach $authorBook

错误:通过关系“cmd\MyBundle\Entity\Book#AuthBooks”找到了一个新实体,该实体未配置为实体的级联持久化操作:cmd\MyBundle\Entity\authorBook@0000000002571fc4000000002c4ddfaa。

为什么该错误与authorBooks关系有关?我的代码只尝试记录新作者。。。

谢啦

编辑_____________

事实上,我做了进一步的测试,并且使用此代码进行了激烈的测试:

public function onSuccess(Page $page){   
    $this->em->flush();

这也会生成相同的错误,就好像错误不是由于表单处理代码...我使用此方法验证了orm模式,到目前为止一切看起来都很好。

我尝试级联持久化实体:

class AuthorBook
{

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="cmd\MyBundle\Entity\Author", inversedBy="authorBooks", cascade={"persist"})
 * @ORM\JoinColumn(nullable=false)
 */
private $author;

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="cmd\MyBundle\Entity\Book", inversedBy="authorBooks", cascade={"persist"})
 * @ORM\JoinColumn(nullable=false)
 */
private $book;

--

class Book
{
/**
 * @var integer $id
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

 /**
 * @ORM\OneToMany(targetEntity="cmd\MyBundle\Entity\AuthorBook", mappedBy="book", cascade={"persist"})
 */
private $authorBooks;

--

class Author
{
/**
 * @var integer $id
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\OneToMany(targetEntity="cmd\MyBundle\Entity\AuthorBook", mappedBy="author", cascade={"persist"})
 */
private $authorBooks;

这将更新错误消息:

AuthorBook类型的实体通过外部实体作者具有标识,但此实体本身没有实体。您必须在相关实体上调用EntityManager#persist(),并确保在尝试持久化“AuthorBook”之前为其生成了标识符。对于插入后ID生成(如MySQL自动递增或PostgreSQL串行),这意味着您必须在两个持久化操作之间调用EntityManager#flush()。

我知道我需要在AuthorBook之前坚持和刷新书籍和作者。然而,我不能刷新任何东西。当我不坚持任何东西时,我甚至有这个错误。

共有2个答案

花品
2023-03-14

如果AuthorBook中没有更多的列(只有外键),我可以尝试建立多个关系。

Url:多对多原则文档

陆琦
2023-03-14

您的类AuthorBook有问题。删除$作者$book@ORM\Id并添加正确的id字段。更新架构时应该有错误消息,但如果没有:

php app/console doctrine:schema:update --force;

AuthorBook更新为:

class AuthorBook
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     *
     * @var integer $id
     */
    protected $id;


    /**
     * @ORM\ManyToOne(targetEntity="cmd\MyBundle\Entity\Author", inversedBy="authorBooks", cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $author;

    /**
     * 
     * @ORM\ManyToOne(targetEntity="cmd\MyBundle\Entity\Book", inversedBy="authorBooks", cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $book;
 类似资料:
  • 问题内容: 如果将新文档索引到Elasticsearch索引,则可在索引操作后1秒钟左右搜索新文档。但是,可以通过调用或对索引进行操作来强制使该文档可立即搜索。这两个操作之间有什么区别- 结果似乎对他们来说是相同的,可以立即搜索文档。 这些操作中的每一项到底是什么? ES文档似乎并未深入解决此问题。 问题答案: 您得到的答案是正确的,但我认为值得详细说明。 刷新有效地调用了Lucene索引读取器上

  • 问题内容: 我有一个JList,它显示来自矢量的信息。然后,用户可以从该向量中添加和删除信息。从Vector添加/删除项目时,是否可以刷新JFrame中的JList?目前我正在做.. 但这不会将JList刷新为新内容。我检查了一下,矢量内容等确实发生了变化,但列表没有刷新。为什么?我该如何解决? 问题答案: 您不应该更新Vector。应该直接对ListModel进行更改,然后表将自动重新绘制自身。

  • 我是一个绝对的初学者laravel。 我想在我的数据库中做一些改变。但是当我试图刷新我的数据库时,我一直在处理下面的错误。 在写这篇文章之前,我在谷歌上搜索了很多东西,阅读了很多参考资料。然而,所有这些都不起作用,帮助我解决了错误。 以前有人遇到过这个错误吗?如有任何建议,将不胜感激。提前谢谢。 PHP致命错误:未捕获异常“UnexpectedValueException”,消息为“流或文件”/w

  • 使用Debezium 0.7从MySQL读取,但在初始快照阶段会出现刷新超时和OutOfMemoryError错误。看下面的日志,连接器似乎试图一次写入太多消息: 想知道正确的设置是什么http://debezium.io/docs/connectors/mysql/#connector-大型数据库的属性( 按照以下建议更改了设置,并解决了问题:

  • 我到处找,但很少有人有这个问题。 在使用外部系统时出现异常:java.lang.assertionerror位于org.jetbrains.plugins.gradle.service.project.baseGradleProjectResolverExtension.populateModuleContentRoot(baseGradleProjectResolverExtension.jav

  • 我做了这段代码,我需要在屏幕上实时显示一些值,所以,我试着这样做,有人知道是怎么回事吗? 安卓显示器: java.lang.NullPointerException:尝试在Android.Widget.TextView.OnMeasure(TextView.java:7520)的Android.View.View.Measure(View.java:19917)的Android.View.View