I am fairly confident that the persistence issued is caused by Hibernate dirty checking. As we're using base entity class with AuditingEntityListener and @DynamicUpdate along with @CreatedDate and @LastModifiedDate annotations on date fields, it seems that it is not consistent when Hibernate tries to detect what to update and might skip it in some scenarios (MonetaryAmount is composite type). Currently when manually modifying lastModifiedDate field on that event handler, the issue has not occurred as this seems to mark the entity as dirty every time.
One more reason not to use Hibernate.