0

当我在我的网站上更改一段内容的“所有者”时,我收到如下所示的错误。我很困惑为什么我会收到这个错误。似乎它正在尝试更改项目本身的 ID。一切看起来都正确......我是否在所有正确的地方寻找?

错误

Caused by: org.hibernate.HibernateException: identifier of an instance of com.site.model.User was altered from 13 to 72

我的 JSP

当我更改为时owner.idowner我得到一个字符串/整数不匹配。

        <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;
4

2 回答 2

1

您正在告诉 spring使用从 JSPid中获取的不同值覆盖 User 对象上的字段。id如果要更改所有者,则需要获取作为新所有者的整个 User 对象,并将引用更改为在父记录上指向它。您不能只更改现有对象的 ID 号。

有很多方法可以做到这一点,通常PropertyEditor使用 a ,因此您将数字直接绑定到值“所有者”并提供一个类来告诉 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);
    }

}
于 2012-05-07T19:09:39.980 回答
0

我也面临这个问题。就我而言,我无法在 sla 字段中输入数字7 。但是,如果我更改7以外的值,则进程正常运行。出现的错误信息如.... was altered from 7 to null

我尝试了很多方法,例如我们将类型数据从 Integer 更改为 Long,创建一个新模型,但问题仍然存在。

直到我更改模型的属性之一,例如:

@Column(name = "sla")
private String sla;

到 :

@Column(name = "sla")
private String slavalue;

维奥拉,问题解决了

于 2021-02-27T03:50:12.487 回答