具有共享主键的两个表之间的一对一
我正在尝试使用JPA / Hibernate设置下表:
User:
userid - PK
name
Validation:
userid - PK, FK(user)
code
可能有很多用户,每个用户最多可以有一个验证码,也可以没有。
这是我的课程:
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();
}
...
}
我创建一个用户,然后尝试使用以下代码添加验证代码:
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();
}
...
}
当我尝试运行它时,我得到一个 org.hibernate.PersistentObjectException: 分离的实体传递给 persist: User
我还尝试在我的验证类中使用以下代码:
public void setUserId(Long userId)
{
this.userId = userId;
}
当我创建验证代码时,我只需执行以下操作:
Validation validation = new Validation();
validation.setUserId(userId);
em.persist(validation);
tx.commit();
但是,由于User为null,我得到org.hibernate.PropertyValueException:not-null属性引用null或瞬态值:User.code
将不胜感激关于如何最好地解决此问题的任何帮助!