2

NHibernate 3.2 で、第 2 レベルのキャッシュ (SysCache) を使用しています。コレクションを削除し、同じトランザクションで新しい要素を書き込んでいます。ただし、削除された要素への参照がまだ保持されているため、これによりキャッシュが壊れます。取引コード:

 RepositorioMovimentacao.Delete(notaHibernate.MovimentacaoItemEquipList);
 RepositorioNota.Update(notaHibernate);
 RepositorioMovimentacao.Save(model.MovimentacaoItemEquipList);
 Session.Commit()

別のセッションでエンティティを取得するときにスローされる例外:

No row with the given identifier ...

これが私のマッピングです:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="CMD.Business.BusinessEntity" namespace="CMD.Business.BusinessEntity.Entities">
  <class name="NotaMovimentacaoEquipamento" table="CEM.NOTA_MOVIMENTACAO_EQUIPAMENTO" lazy="true" dynamic-update="true" dynamic-insert="true" >
    <cache  usage="read-write"/>
...
    <bag name="MovimentacaoItemEquipList" inverse="true" generic="true" lazy="true" >
      <cache  usage="read-write"/>
      <key>
        <column name="NTMO_SQ_NOTA_MOVIMENTACAO"/>
      </key>
      <one-to-many class="MovimentacaoItemEquip" />
    </bag>
...

多対一のマッピング:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="CMD.Business.BusinessEntity" namespace="CMD.Business.BusinessEntity.Entities">
    <class name="MovimentacaoItemEquip" table="CEM.MOVIMENTACAO_ITEM_EQUIP" lazy="true" dynamic-update="true" dynamic-insert="true" >
    <cache  usage="read-write"/>
...
  <many-to-one name="NotaMovimentacaoEquipamento" class="NotaMovimentacaoEquipamento">
      <column name="NTMO_SQ_NOTA_MOVIMENTACAO" />
    </many-to-one>
...

ありがとう!

4

1 に答える 1

0

解決策を見つけました。親のコレクションを削除するときは、コミットする前に必ず親コレクションをnullに設定してください。

例:

ChildRepository.Delete(parent.ChildList)
parent.ChildList = null;

これを行わないと、キャッシュが破損する原因になりました。

于 2012-08-15T13:39:58.897 に答える