OneToOne entre deux tables, avec partage de la clé primaire

Je vais essayer de mettre en place les tableaux suivants en utilisant JPA/Hibernate:

User:

userid - PK
name 

Validation:

userid - PK, FK(user)
code

Il peut y avoir de nombreux utilisateurs, et chaque utilisateur peut avoir max un code de validation ou d'aucun.

Voici mes classes:

public class User 
{
    @Id
    @Column(name = "userid") 
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    protected Long userId;

    @Column(name = "name", length = 50, unique = true, nullable = false)
    protected String name;

    ...
}

public class Validation 
{
    @Id
    @Column(name = "userid")
    protected Long userId;

    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn(name = "userid", referencedColumnName = "userid")
    protected User user;

    @Column(name = "code", length = 10, unique = true, nullable = false)
    protected String code;

    ...

    public void setUser(User user)
    {
        this.user = user;
        this.userId = user.getUserId();
    }

    ...
}

J'ai créer un utilisateur, puis essayez d'ajouter un code de validation à l'aide du code suivant:

public void addValidationCode(Long userId)
{   
    EntityManager em = createEntityManager();
    EntityTransaction tx = em.getTransaction();

    try 
    {
        tx.begin();

        //Fetch the user
        User user = retrieveUserByID(userId);

        Validation validation = new Validation();
        validation.setUser(user);
        em.persist(validation);
        tx.commit();
    }
    ...
}

Quand j'essaie de le lancer, je reçois un org.mise en veille prolongée.PersistentObjectException: détaché entité passé à persister: l'Utilisateur

J'ai aussi essayé d'utiliser le code suivant dans ma Validation de classe:

public void setUserId(Long userId)
{
    this.userId = userId;
}

et quand j'ai créer un code de validation je n'ai tout simplement:

Validation validation = new Validation();
validation.setUserId(userId);
em.persist(validation);
tx.commit();

Mais alors, étant donné que l'Utilisateur est null je reçois org.mise en veille prolongée.PropertyValueException: non-null références de propriété a la valeur null ou transitoire de la valeur: l'Utilisateur.code

Serais reconnaissant de toute aide sur la meilleure façon de résoudre ce problème!

OriginalL'auteur Jonas | 2011-04-27