[英]Unable to save entity changes: identifier of an instance was altered
當我更改網站上某段內容的“所有者”時,我收到如下所示的錯誤。 我很困惑為什么我會收到這個錯誤。 似乎它正在嘗試更改項目本身的 ID。 一切看起來都正確......我是否在所有正確的地方尋找?
錯誤
Caused by: org.hibernate.HibernateException: identifier of an instance of com.site.model.User was altered from 13 to 72
我的 JSP
當我將owner.id
更改為owner
我得到一個字符串/整數不匹配。
<label class="formLabel">Owner <img src="/images/s.gif" class="required"/><br/>
<form:select path="owner.id" id="owner">
<form:options items="${owners}" itemValue="id" />
</form:select>
</label>
我的服務
Content cm = em.merge(content);
em.flush();
內容模型
@NotNull
@JoinColumn(name = "owner_id", referencedColumnName = "id")
@ManyToOne
@IndexedEmbedded
@JsonIgnore
private User owner;
用戶模型
@Id
@Basic(optional = false)
@Column(name = "id")
@GeneratedValue(strategy= GenerationType.IDENTITY)
@JsonIgnore
private Integer id;
您告訴 spring 覆蓋用戶對象上的id
字段,使用從 JSP 中獲取的不同id
值。 如果要更改所有者,則需要獲取作為新所有者的整個 User 對象,並將引用更改為在父記錄上指向它。 您不能只更改現有對象的 ID 號。
有多種方法可以實現這一點,通常使用PropertyEditor
將一個數字直接綁定到值 'owner' 並提供一個類來告訴 spring 如何將一個數字轉換為 User 的實例。
在表單上,綁定到 'owner' 而不是 'id':
<form:select path="owner" id="owner">
<form:options items="${owners}" itemValue="id" />
</form:select>
在控制器中,初始化一個屬性編輯器:
@InitBinder
private void registerPropertyEditor(DataBinder binder) {
binder.registerCustomEditor(User.class, "owner", new UserPropertyEditor(userService));
}
然后創建一個類,告訴 spring 如何將 ID 號轉換為用戶:
public class UserPropertyEditor extends PropertyEditorSupport {
private UserService userService;
public UserPropertyEditor(UserService userService) {
this.userService = userService;
}
@Override
public String getAsText() {
//Handle null value, value of incorrect type, etc here
return String.valueOf(((User) getValue()).getId());
}
@Override
public void setAsText(String id) throws IllegalArgumentException {
//handle empty string, number format exception, etc
User user = userService.getUser(integerId);
setValue(user);
}
}
我也面臨這個問題。 就我而言,我無法在 sla 字段中輸入數字7 。 但是,如果我更改7以外的值,則進程會正常運行。 出現的錯誤信息如.... was altered from 7 to null
我嘗試了很多方法,例如我們將類型數據從 Integer 更改為 Long,創建新模型,但問題仍然存在。
直到我更改模型的屬性之一,例如:
@Column(name = "sla")
private String sla;
到 :
@Column(name = "sla")
private String slavalue;
中提琴,問題解決了
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.