簡體   English   中英

嘗試使用@ManyToOne映射來持久化實體

[英]Trying to persist an entity with @ManyToOne mapping

我正在嘗試堅持使用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;
}

此錯誤意味着“ 您正在引用一個null(非持久化)對象 ”,您必須選擇:刪除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的代理實例。 Proxied對象沒有命中數據庫,因此避免使用SELECT,並且在UserStatus代理上設置的唯一字段是解析@ManyToOne關系所必需的ID!

一些有用的答案: 何時使用EntityManager.find()vs EntityManager.getReference()
EntityManager.find()和EntityManger.getReference()之間有什么區別?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM