我已经使用Doctrine创建了一个Symfony项目,当我在数据库中持久化一个实体时,我看到它保存了两次。persistAndflush()我都用过,persist()和flush()我也分别用过,但是我不明白问题是什么。
persistAndflush()
persist()
flush()
nimxete21#
假设在控制器中,您有多个操作要对不同对象执行:一米零一米零一米零一米零一米零一米零一米零一米零一米零二米零一米零。现在您需要保存数据库中的所有转换(创建、更新、删除)。要告诉ORM它需要执行这些操作,您需要通过以下方式“填充队列”:
$em->persist($obj1); $em->persist($obj2); $em->persist($obj3);
现在在你的队列中你有了三个对象,但是数据库中仍然没有变化。刷新操作告诉ORM/ODM“现在应用这些变化”。
$em->flush();
因此,应用于三个对象的修改将按照persist调用的顺序存储在数据库中:一米三米一,一米四米一,一米五米一。
bybem2ql2#
换句话说,在每两次刷新之间,一个新的事务开始。你可以将其与使用普通PDO连接的事务、提交、回滚进行比较。
14ifxucb3#
persist()和persistFlush()方法用于将实体保存到数据库。这两个方法都是EntityManager接口的一部分,该接口用于管理Java应用程序中实体的持久性。persist()和persistFlush()之间的主要区别在于,persist()将实体排队以插入数据库,但不立即执行insert语句,而是在提交事务或调用flush()方法时执行插入。另一方面,persistFlush()将persist()和flush()方法组合到一个调用中,它将实体排队等待插入,并立即执行insert语句,刷新对数据库的更改。persist()和persistFlush()在不同的情况下都很有用。persist()在您希望将多个要插入的实体排队并将它们一次全部刷新到数据库时很有用,而persistFlush()在您希望立即持久化实体并确保将其保存到数据库时很有用。通常,当您希望优化性能时,使用persist()是一个好主意;当您希望确保实体立即持久化到数据库时,使用persistFlush()是一个好主意。
persistFlush()
EntityManager
3条答案
按热度按时间nimxete21#
假设在控制器中,您有多个操作要对不同对象执行:一米零一米零一米零一米零一米零一米零一米零一米零一米零二米零一米零。
现在您需要保存数据库中的所有转换(创建、更新、删除)。要告诉ORM它需要执行这些操作,您需要通过以下方式“填充队列”:
现在在你的队列中你有了三个对象,但是数据库中仍然没有变化。刷新操作告诉ORM/ODM“现在应用这些变化”。
因此,应用于三个对象的修改将按照persist调用的顺序存储在数据库中:一米三米一,一米四米一,一米五米一。
bybem2ql2#
换句话说,在每两次刷新之间,一个新的事务开始。你可以将其与使用普通PDO连接的事务、提交、回滚进行比较。
14ifxucb3#
persist()
和persistFlush()
方法用于将实体保存到数据库。这两个方法都是EntityManager
接口的一部分,该接口用于管理Java应用程序中实体的持久性。persist()
和persistFlush()
之间的主要区别在于,persist()
将实体排队以插入数据库,但不立即执行insert语句,而是在提交事务或调用flush()
方法时执行插入。另一方面,
persistFlush()
将persist()
和flush()
方法组合到一个调用中,它将实体排队等待插入,并立即执行insert语句,刷新对数据库的更改。persist()
和persistFlush()
在不同的情况下都很有用。persist()
在您希望将多个要插入的实体排队并将它们一次全部刷新到数据库时很有用,而persistFlush()
在您希望立即持久化实体并确保将其保存到数据库时很有用。通常,当您希望优化性能时,使用
persist()
是一个好主意;当您希望确保实体立即持久化到数据库时,使用persistFlush()
是一个好主意。