A relação um-para-muitos da doutrina não salva - Violação de restrição de integridade

Estou tentando usar as associações ORM da doutrina. Eu li vários tutoriais e documentos on-line, mas não está funcionando e, sinceramente, não tenho certeza do que estou fazendo de errado aqui. Parece que meus experimentos com Doutrina são um sucesso ou um fracasso. Qualquer ajuda seria apreciada.

Eu gostaria de ter uma entidade de usuário e uma entidade de UserHistory, que possui várias linhas para um único usuário. Isso para mim soa como um para muitos. Não preciso necessariamente que seja bidirecional.

O problema que estou tendo é adicionar um item de histórico a um usuário, resultando em um erro quando o usuário é salvo, porque a coluna user_id não está definida na tabela user_history.

Entidades:

# Entity\User.php
<?php
namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(type="string",length=255)
     */
    protected $username;

    /**
     * @ORM\OneToMany(targetEntity="UserHistory", mappedBy="user", cascade={"persist","remove"})
     * @ORM\JoinColumn(name="id", referencedColumnName="user_id")
     */
    protected $history;

    public function __construct()
    {
        $this->setHistory(new ArrayCollection());
    }

    public function getHistory()
    {
        return $this->history;
    }
}

# Entity\UserHistory.php
<?php
namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="user_history")
 */
class UserHistory
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="User")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
     */
    protected $user;

    public function getUser()
    {
        return $this->user;
    }
}

No meu controlador, estou tentando o seguinte:

    $em = $this->getUserService()->getEntityManager();
    $user = $em->find('Picpara\Entity\User', 1);
    $history = new UserHistory();
    $user->getHistory()->add($history);
    $em->persist($user);
    $em->flush();

Tudo isso resulta em uma violação de restrição de integridade.

Doctrine \ DBAL \ DBALException

Arquivo: /myproject/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php:91

Mensagem:

Ocorreu uma exceção ao executar 'INSERT INTO user_history (user_id) VALUES (?)' Com parâmetros [null]:

SQLSTATE [23000]: Violação de restrição de integridade: 1048 A coluna 'user_id' não pode ser nula

Como eu disse, eu procurei por aqui no SO, pesquisei no Google, tentei mudar as coisas nas anotações. Isto é tanto quanto eu entendo. Não tenho certeza do que estou fazendo de errado. Alguém pode ajudar?

questionAnswers(1)

yourAnswerToTheQuestion