3

我正在尝试保留一个具有 @ManyToOne 与UserStatus映射的用户

但是当我执行下面的代码时,休眠会抛出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;
}
4

1 回答 1

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 的代理实例。代理对象不会命中数据库,因此避免了 SELECT 并且在 UserStatus 代理上设置的唯一字段是 ID,这是解析 @ManyToOne 关系所必需的!

一些有用的答案:何时使用 EntityManager.find() 与 EntityManager.getReference() EntityManager.find() 和 EntityManger.getReference()
有什么区别?

于 2013-08-07T13:53:57.507 回答