簡體   English   中英

無法保存實體更改:實例的標識符已更改

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

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