Ok habe die Lösung gefunden:
/**
* User
*
* @ORM\Table("users")
* @ORM\Entity
*/
class User extends UserEntity
{
...
/**
* @ORM\OneToOne
* (
* targetEntity="UserPreferences",
* cascade={"persist", "remove"},
* inversedBy="user"
* )
*/
protected $userPreferences;
}
/**
* @ORM\Table("user_preferences")
* @ORM\Entity
*/
class UserPreferences extends UserPreferencesEntity
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
protected $id;
/**
* @var int
*
* @ORM\OneToOne(targetEntity="User", mappedBy="id", cascade={"persist", "remove"})
*/
protected $user;
...
}
Zuerst musste ich mappedBy und inversedBy angeben (was ich schon vorher versucht habe, aber in die falsche Richtung - mappedBy auf der besitzenden Seite, inversedBy auf der inversen Seite). Außerdem dachte ich, dass die umgekehrte Seite keine separate ID haben muss, und ich habe versucht, die ID der besitzenden Seite (User#id) auch für diese als Primärschlüssel zu verwenden.
- http://docs.doctrine-project. org/en/latest/reference/unitofwork-associations.html
- http://docs.doctrine-project. org/en/latest/reference/association-mapping.html