0

データベースからレコードを削除しようとしていますが、削除する前に、その子の 1 つを別のレコードにコピーしているため、次のエラーが発生します。

SEVERE: org.hibernate.StaleStateException: Batch update returned unexpected row count 
from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:81)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:73)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:59)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3224)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3126)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3456)
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:364)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:356)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:278)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:328)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
.....

1) 最初の関数で (レコード 18 からリストを取得し、新しいレコードに追加します)

 ....
 User user = (User) session.get(User.class, 18L);
 tx.commit();

 User client = new User();
 client.getmyList().setItems(user.getmyList().getItems());
 return client;

2) 2 番目の関数で (レコード 18 を削除)

 User user = (User) session.get(User.class, 18L);
 session.delete(user);

3) 3 番目の関数 (新しいレコードを保存)

 session.save(client);             

ユーザークラス

@Entity
@DynamicUpdate
public class User{

    .....

    @OneToOne(cascade = CascadeType.ALL)
    public UnitWatchList getmyList() {
        return myList;
    } 

    ...
} 
4

3 に答える 3

1

おそらく、DAO メソッドの deleteAndMoveChildrensTo(LongvictimId, Long recipientId) を次のように記述します。

DAO クラス:

public boolean deleteAndMoveChildrensTo(Long victimId, Long recipientId) {
        User victim = (User) getSession().load(User.class, victimId);
        User recipient = (User) getSession().load(User.class, recipientId);
        for (UnitWatchList unitWatch : victim.getmyList().getItems()) {
            unitWatch.setUser(recipient);
        }
        recipient.getmyList().addAll(victim.getmyList().getItems());
        getSession().saveOrUpdate(recipient);
        getSession().flush();
        getSession().evict(victim);
        victim = (User) getSession().load(User.class, victimId);
        getSession().delete(victim);
        return true;
    }

および対応する Service クラスは次のとおりです

サービス クラス。

@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public boolean deleteAndMoveChildrensTo(Long victimId, Long recipientId) {
    DAO.deleteAndMoveChildrensTo(victimId, recipientId);
}

これを試してみて、これで問題が解決することを願っています...

于 2013-09-24T06:56:07.530 に答える
1

の後に、2 番目の関数でトランザクションをクローズしますsession.delete(user);か? たぶん、あなたの問題は ではsession.delete()なく にありsession.save()ます。

ではどのようにマッピングさitemsUnitWatchListますか?

よろしく、

于 2013-09-24T06:07:23.497 に答える
1

Hibernate には、セッション オブジェクトに関連付けられたデフォルトの第 1 レベルのキャッシュがあります。そのため、オブジェクトへのアクセスがキャッシュされ、それ以降のアクセスがキャッシュから取得されます。

次に、参照オブジェクトを他の変数に割り当てると、参照のみが変更されます。

コードをトレースしましょう

  1. User オブジェクトを取得します。たとえば、メモリの場所 (a) でそれを言いましょう。User user = (User) session.get(User.class, 18L)
  2. ユーザー オブジェクトが別のオブジェクトに割り当てられています。メモリ ロケーションとしてのみ設定されることに注意してください。実際のコピーはありません。client.getmyList().setItems(user.getmyList().getItems());
  3. オブジェクトを再度削除します。ただし、取得されたオブジェクトはキャッシュからフェッチされるため、まだメモリ ロケーション (a) にあります。User user = (User) session.get(User.class, 18L);
  4. メモリ位置にあるオブジェクトを削除 (a)session.delete(user);
  5. メモリ ロケーション (a) にあるユーザー オブジェクトも含むオブジェクトを保存しようとしましたsession.save(client);が、実際のオブジェクトはありません。これは削除されます。

プロトタイプパターンは、一般的に対処オブジェクトに使用されます。clone メソッドもオーバーライドできます。ただし、エンティティ オブジェクトのコピーが作成されると、. 新しいオブジェクトは、別の問題である休止状態セッションによって維持されません。

私の謙虚な考えでは、オブジェクトが再度保存される場合にオブジェクトを削除することは、良い習慣ではありません。保存したいのになぜ削除するのですか?これらの問題を解決するには、マッピングも再配置する必要があります。

こちらもご覧ください

プロトタイプパターン

ハイバネートキャッシング

型、値、および変数

于 2013-09-24T07:25:32.333 に答える