[英]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.