- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个事件订阅者,其中包含两个生命周期事件方法:prePersist 和 preUpdate。 prePersist 正在按预期工作 - 我修改文档,并且稍后在检索文档时会反射(reflect)更改。但 preUpdate 并未按预期工作。基本上是这样的:
/**
* Also update the foo code when the bar profile is updated.
* @param LifecycleEventArgs $args
*/
public function preUpdate(LifecycleEventArgs $args)
{
$document = $args->getDocument();
if ($document instanceof BarProfile) {
$document->setFooCode('Salamanders');
}
}
如果我创建一个文档并在 perPersist 函数中将其 fooCode 设置为“占位符”,那么当我稍后检索该文档时,它的 fooCode 为“占位符”。如果我随后更新它并再次检索它,那么我期望它的 fooCode 为“Salamanders”。然而,它仍然是“占位符”。我什至尝试将 error_log()
内容放入其中,并将内容写入日志,以便我可以看到该方法正在执行。
在 $document->setFooCode()
之后我是否需要执行第二步才能使 fooCode 的新值保留下来?
最佳答案
您不能直接在 preUpdate
事件中修改字段,您必须修改它们的原始值。不允许更改关联。你必须这样做:
$eventArgs->setNewValue('fooCode', 'Salamanders');
您表示“prePersist 正在按预期工作 - 我修改了文档,并且稍后在我检索文档时会反射(reflect)更改。”
这让我相信您可能没有意识到持久化和更新之间的区别。在 Doctrine 中,当您第一次创建对象时会发生持久化。当您对已由 Doctrine 管理的现有对象进行更改时,就会发生更新。很多人对此感到困惑,但当你更新现有实体时,不需要调用persist(),只需要调用flush()即可。例如:
// inserts a new entity into the database
$document = new Document();
$document->setName('My Document');
$em->persist($document);
$em->flush();
和
// retrieves entity from the database, makes a change, then updates the database
$document = $em->findOneByName('My Document');
$document->setFooCode('Salamanders');
$em->flush();
我鼓励您read the Doctrine documentation就像塞拉德建议的那样。密切注意 preUpdate
事件的以下语句:
- PreUpdate is the most restrictive to use event
- Changes to associations of the updated entity are never allowed in this event
- Changes to fields of the passed entities are not recognized by the flush operation anymore, use the computed change-set passed to the event to modify primitive field values
关于symfony - 使用 Doctrine 的 PreUpdate 生命周期事件保留对文档所做的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27714773/
我有两个具有一对多关系的实体。父可以有多个子实体实例。我向父级添加了一个字段,用于存储子级修改的日期 (childrenLastModifiedDate)。为了保持这一点,我添加了方法: @PrePe
我们有以下 PreUpdate 事件监听器: public bool OnPreUpdate(PreUpdateEvent @event) { BaseBO e
我有一个具有最后修改属性的实体: @Temporal(TemporalType.TIMESTAMP) private Date lastModified; @PreUpdate @PrePersist
我已将以下类定义为默认实体监听器,因此每次调用 persist() 或 merge() 方法时,都会自动执行此代码: public class StringProcessorListener {
我有两个具有一对多关系的实体。Parent 可以有多个 Child 实体实例。我向父项添加了一个字段,用于存储子项修改的日期 (childrenLastModifiedDate)。为了保持这一点,我添
我有以下类(class): @MappedSuperclass public abstract class MappedModel { @Id @GeneratedValue(
见下文。 type User struct { Id int64 `db:"id" json:"id"` Name string `db:"name" json:"
我是 Symfony2 的新手,我想知道 prePersist 和 preUpdate 事件有什么区别。看起来 prePersist 在我“保留”记录之前被“触发”,但是 preUpdate 什么时候
我有一个使用 lombok 的 Spring 项目和一个这样定义的 JPA 带注释的类: @EqualsAndHashCode @AllArgsConstructor @NoArgsConstruct
我有一个实体的 preUpdate 监听器,我可以在其中进行一些计算、设置值等。 在该监听器中,我想删除一些其他相关实体,但这似乎不会被实体管理器刷新。我怎样才能实现这一目标? 最佳答案 根据教义2
这个问题已经有答案了: JPA EventListener method not called on change to many-to-many collection? (2 个回答) 已关闭 4
每当我尝试在实体上使用 @PreUpdate 注释时,都会收到 stackoverflow 异常,该实体使用嵌入式可审计实体和 @EntityListeners。 在我的实体中,我尝试通过服务获取用户
有人可以向我解释以下行为的原因吗? EntityA 首先被创建,然后使用 em.persist(..) 方法持久化。 @PrePersist 回调在事务结束前执行。它工作正常。 在新事务中 Entit
这个问题在这里已经有了答案: JPA EventListener method not called on change to many-to-many collection? (2 个答案) 关闭
文档说: Changes to fields of the passed entities are not recognized by the flush operation anymore, use
假设以下代码片段使用 @PrePersist 和 @PreUpdate 注释和 Joined-type 继承: @Entity @Inheritance(strategy=InheritanceTyp
当用户加入组时,我正在尝试执行某些操作。我正在尝试使用 preUpdate 事件,然后检查相应的关系是否已更改。不幸的是,在我的组中,“用户”关系从来不在变更集中,在我的用户中,用户组也从来不在变更集
我的 parent 和 child 之间有一对多的关系。下面是关系的代码片段。 @Entity @Table(name = "Parent") public class Parent{ @On
我在使用 @PreUpdate 和 @PrePersist 填写审核字段时遇到问题。例如,当我想更新客户端实体时,字段updatedBy和updatedAt仍然是null;尽管当我调试时,执行了用@P
我一直在研究实体、oneToMany 关系,问题是每当我使用它时: //Parent class @OneToMany(cascade = {CascadeType.PERSIST, Casca
我是一名优秀的程序员,十分优秀!