Я пытаюсь создать следующие таблицы с помощью 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: detached entity passed to persist: User
Я также попытался использовать следующий код в классе Validation:
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 property references a null or transient value: User.code
Буду признателен за любую помощь в решении этой проблемы!