diff --git a/index.md b/index.md
index b6836f7a033841c40dd2cb0328f3b4f9463d5644..65ca8e6161f8f0b4e8ceb57a1943b566d14f3d97 100644
--- a/index.md
+++ b/index.md
@@ -137,6 +137,52 @@ Note:
 - Doctrine Embeddables
 - Custom types
 
+---
+### Les embeddables
+
+```php
+use Doctrine\ORM\Annotation as ORM;
+
+class NiceArticle
+{
+    private $uuid;
+
+    /** @ORM\Embedded(class = "ArticleContent") */
+    private $articleContent;
+}
+```
+
+Note:
+- À utiliser en cas de Value Object composite
+- Des soucis avec la nullabilité, contournables avec un package
+- Ne peuvent contenir des colonnes complexes
+
+---
+### Les custom types
+
+```php
+use Doctrine\DBAL\Platforms\AbstractPlatform as P;
+
+final class ArticleContentType extends Type
+{
+    public function convertToPHPValue($value, P $p): ArticleId
+    {
+        return new ArticleId($value);
+    }
+
+    public function convertToDatabaseValue($value, P $p): string
+    {
+        return (string) $value;
+    }
+}
+```
+
+Note:
+- Permet de contrôler qu'on respecte toujours les règles métier à
+  l'hydratation. Si ça crashe, c'est qu'il manque des migrations.
+- La méthode `getName()` fait doublon avec le nom utilisé lors de
+  l'enregistrement du type dans le registre de type, et disparaître dès Doctrine 3
+
 ---
 ### Les constructeurs nommés