Le problème est probablement votre stratégie de génération d'identifiant (à condition que vous ayez correctement initialisé le contact). L'objet utilisateur doit être inséré dans la base de données pour que son identifiant soit défini, mais en même temps, le contact a besoin que cet identifiant soit un objet valide. Ils doivent tous les deux se produire dans la même transaction.
Si vous passez le niveau de journalisation à fin pour votre JPA (dans perstitance.xml), vous verrez très probablement la séquence d'insertion de l'utilisateur et du contact, mais le contact aura user_id 0.
Donc, a) assurez-vous de définir explicitement l'utilisateur dans votre contact (comme vous l'avez dit, la relation est gérée par Contact. b) Définissez le contact sur l'utilisateur. c) persister (dans une transaction). Selon votre implémentation JPA, cela peut toujours ne pas fonctionner (vérifiez les requêtes émises, il y aura très probablement une insertion sur le contact, puis une mise à jour). Changez la stratégie de génération en TABLE, avec TABLE JPA prend le prochain ID libre, l'attribue à l'objet et fait l'insertion afin qu'il soit "connu" avant l'insertion.