0

サイトのコンテンツの「所有者」を変更すると、次のようなエラーが表示されます。なぜこのエラーが発生するのか、非常に混乱しています。アイテム自体の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;
4

2 に答える 2

1

idそこにあるUserオブジェクトのフィールドをid、JSPから取得した別の値で上書きするようにSpringに指示しています。所有者を変更する場合は、新しい所有者であるUserオブジェクト全体を取得し、親レコードでそれを指すように参照を変更する必要があります。既存のオブジェクトのID番号を変更するだけでは不十分です。

これを実現するにはいくつかの方法があります。通常はaPropertyEditorを使用して、数値を値'owner'に直接バインドし、数値をUserのインスタンスに変換する方法をSpringに指示するクラスを提供します。

フォームで、「id」ではなく「owner」にバインドします。

<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));
}

次に、ID番号をユーザーに変換する方法をSpringに指示するクラスを作成します。

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に変更し、新しいモデルを作成するなど、多くのアプローチを試みましたが、問題はまだ存在します。

モデルのプロパティの1つを変更するまで、例:

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

に :

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

ヴィオラ、問題はなくなった

于 2021-02-27T03:50:12.487 に答える