1

重複の可能性:
Spring + Hibernate:同じ識別子値を持つ別のオブジェクトがすでにセッションに関連付けられています

から@idエンティティのを変更した後

@Id
private int getId(){
     return this.id;
}

@Id
private String getLogin(){
     return this.login;
}

エラーが発生します:

a different object with the same identifier
value was already associated with the session

Webアプリケーションでは何も変更されていません。エンティティを読み取り、フォームのいくつかのフィールドを変更し、送信後、エンティティを保存または更新しようとしました。intasでは@Id問題はありませんでしたが、エンティティを更新または保存することで上記のエラーが発生しましたString@Id

 @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
 public void saveOrUpdate(User u) {  
  getHibernateTemplate().saveOrUpdate(u);  
 }

何が問題なのですか?

4

1 に答える 1

4

これは、一意でない、または自動インクリメント識別子が設定されている分離オブジェクトを保存または更新しようとしていることを意味します。

新しいオブジェクトを挿入する場合は、自動インクリメントを使用するかどうかに応じて、IDを空または一意にします(自動インクリメントの場合はnull、非自動インクリメントの場合は一意の値を設定します)、更新する場合コンテキストにアタッチされていることを確認する必要があります。

オブジェクトのアタッチされたバージョンを返すsession.merge(object)を使用して、オブジェクトをコンテキストに再アタッチできます。

言い換えると:

挿入しようとしている場合は、Idとして構成されているフィールドが、自動インクリメントを使用している場合はnullであるか、一意であることを確認してください。

更新しようとしている場合は、オブジェクトがアタッチされていることを確認してください。これを行うには、データベースから(使用しているフィールドに基づいて)選択し、変更を加えてから更新するか、session.merge(object)メソッドを呼び出して、添付されたバージョンのオブジェクトを受け取ります。また、更新します。

于 2011-05-03T19:52:01.193 に答える