我正在尝试使用 UserStatus
来保留具有映射@ManyToOne的用户但是当我执行下面的代码时,hibernate会抛出 PropertyValueException
user.setStatus(new UserStatus(1));
em.persist(user); // ou session.saveAndUpdate(user);
开始工作我必须这样做:
user.setStatus(em.getReference(UserStatus.class, 1));
em.persist(user); // ou session.saveAndUpdate(user);
我知道第一种方式是可能的,但我不知道的是我是否需要配置或调用另一种方法(我已经尝试过Session中的saveAndUpdate并且仍然是相同的)
有没有人有任何想法?
错误消息是:
not-null property references a null or transient value
映射
@ManyToOne(optional = false)
@JoinColumn(name = "user_status_id", nullable = false)
public UserStatus getStatus() {
return status;
}
答案 0 :(得分:1)
此错误表示“您正在引用空(非持久)对象”,您必须选择:删除nullable
或设置@Cascade
以便UserStatus
当你em.persist(user)
@ManyToOne(optional = false)
@JoinColumn(name = "user_status_id", nullable = false)
@Cascade(cascade=CascadeType.ALL)
public UserStatus getStatus() {
return status;
}
编辑:经过各种测试后,使用getReference()
是正确的方法,因为new UserStatus(1)
会出错,应该替换为getReference(UserStatus.class,ID)
以返回UserStatus的代理实例。 Proxied对象没有命中数据库,因此避免使用SELECT,并且在UserStatus代理上设置的唯一字段是解析@ManyToOne关系所必需的ID!
一些有用的答案:When to use EntityManager.find() vs EntityManager.getReference()
What is the difference between EntityManager.find() and EntityManger.getReference()?