尝试使用@ManyToOne映射来持久化实体

时间:2013-08-07 13:41:10

标签: java hibernate jpa orm

我正在尝试使用 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;
}

1 个答案:

答案 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()?