An _EntityManager_ and the underlying _UnitOfWork_
employ a strategy called [transactional write-behind](https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/architecture.html#transactional-write-behind)
that delays the execution of SQL statements in order to
execute them in the most efficient way and at the end
of a transaction so that all write locks are quickly
released. You should see Doctrine as a tool to
synchronize your in-memory objects with the database
in well defined [units of work](https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/architecture.html#the-unit-of-work).
Work with your objects and modify them as usual. For
the most part, Doctrine ORM already takes care of proper [transaction demarcation](https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/transactions-and-concurrency.html#transaction-demarcation)
for you: All the write operations (INSERT/UPDATE/DELETE)
are queued until _EntityManager#flush()_ is invoked which
wraps all of these changes in a single transaction.
Declaring an Entity
-------------------
```php
<?php
namespace Plugin\Embed\Entity;
use App\Core\Entity;
use DateTimeInterface;
class AttachmentEmbed extends Entity
{
private int $attachment_id;
private ?string $mimetype;
private ?string $filename;
private ?string $media_url;
private \DateTimeInterface $modified;
/* Getters and Setters */
public static function schemaDef()
{
return [
'name' => 'attachment_embed',
'fields' => [
'attachment_id' => ['type' => 'int', 'not null' => true, 'description' => 'Embed for that URL/file'],
'mimetype' => ['type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'],
'filename' => ['type' => 'varchar', 'length' => 191, 'description' => 'file name of resource when available'],
'media_url' => ['type' => 'text', 'description' => 'URL for this Embed resource when applicable (photo, link)'],
'modified' => ['type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'],
When the ORM isn't powerful enough to satisfy your needs,
you can resort to [Doctrine QueryBuilder](https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/query-builder.html#the-querybuilder).