gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:15 26 4
gpt4 key购买 nike

我正在尝试保留一个具有映射 @ManyToOne 和 UserStatusUser

但是当我执行下面的代码时,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 中保存和更新,但仍然如此)

有人知道吗?

错误信息是:

not-null property references a null or transient value

映射

@ManyToOne(optional = false)
@JoinColumn(name = "user_status_id", nullable = false)
public UserStatus getStatus() {
return status;
}

最佳答案

此错误表示“您正在引用一个空(非持久化)对象”,您必须做出选择:删除 nullable 或设置 @Cascade 所以当你执行 em.persist(user)

时, UserStatus 将持续存在
@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 关系所必需的!

一些有用的答案:When to use EntityManager.find() vs EntityManager.getReference()
What is the difference between EntityManager.find() and EntityManger.getReference()?

关于java - 尝试使用 @ManyToOne 映射来持久化实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18105011/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com