0

私はすでにフォーラムで検索していますが、成功せずに多くのことを試しました。

トランザクションメソッドの最後で、最後にのみ、Hibernate getHibernateTemplate ().saveOrUpdate() メソッドを明示的に使用する hibernate オブジェクトのみを保存し、セッターを使用してのみ変更するダーティーオブジェクトではなく保存したい。

私のサービスレイヤーコードを読んだ後、私の必要性はより明確になります:

簡単にするために、コードを要約します。

サービス層:

@Service("cartService")
public class CartServiceImpl extends AbstractServiceImpl<Cart> implements
        CartService {

   @Autowired 
   private CartDao cartDao;

   @Transactional(readOnly = false)
   public Cart updateCart1(){

            Cart cartA = cartDao.findById(1);
            cartA.setTotal=(5);

            Cart cartB = cartDao.findById(1);
            cartB.setTotal=(5);     
            CartDao.Update(cartB);
   }
}

したがって、メソッド updateCart1() の最後に必要なのは、 cartB の変更を保存することですが cartA変更を保存することではありません

ダオ層:

注: cartDao のメソッド (findById、saveOrUpdate)は HibernateTemplate を呼び出します

public T update(T entite) {
    getHibernateTemplate().saveOrUpdate(entite);
    return entite;
}

public T findById(Serializable id) {
    return getHibernateTemplate().get(this.clazz, id);
}

Dao のメソッドが、トランザクション サービス レイヤー メソッドの外側のデータベースに作用することは望んでいませんでした。そして、サービス層で定義されたトランザクションの最後に、それらをデータベースで実行したかったのです。したがって、休止状態のスプリング構成ファイルでは:

<prop key="connection.autocommit">false</prop> 

私はLazyu ローディングの目的で OpenSessionInViewFilter使用していることに注意してください。だから私のXMLファイルで:

<filter>
  <filter-name>OpenSessionInViewFilter</filter-name>
  <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  <init-param>
     <param-name>singleSession</param-name>
     <param-value>false</param-value>
  </init-param> 
</filter>

注: これらのカートcartDao のメソッドは、通常のシナリオでは正常に機能しています。しかし、私が説明しているものではありません。そして、「@Transactional」は正しく構成され、正常に動作します。

問題: このコードでは、2 つのオブジェクト (cartA と cartB) がデータベースで変更されますが、HibernateTemplate の saveOrUpdate メソッドを明示的に呼び出さなかった cartA を変更したくありません。

フォーラムで検索した後、休止状態の FLUSH モードをFLUSH_NEVERにしようとしました。しかし、 CartDao.Update(cartB) の実行時に、次の例外が発生します。

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

助けてくれますか?

4

2 に答える 2

2

あなたは呼び出すことができます

getHibernateTemplate().getSession().evict(cartA);

セッションから削除します。

ただし、cartA を変更しないことが最善の方法です。cartA プロパティを使用して何かを計算する必要がある場合は、そのプロパティのコピーを作成できます。

于 2013-10-26T13:11:19.670 に答える
0

org.hibernate.StatelessSessionの代わりにインターフェイスを使用できますorg.hibernate.Session

javadocs には次のように表示されます。

ステートレス セッションは、第 1 レベルのキャッシュを実装せず、第 2 レベルのキャッシュと対話せず、トランザクションのライトビハインドまたは自動ダーティ チェックを実装せず、関連付けられたインスタンスに操作をカスケードしません。ステートレス セッションでは、コレクションは無視されます。ステートレス セッションを介して実行される操作は、Hibernate のイベント モデルとインターセプターをバイパスします。ステートレス セッションは、第 1 レベルのキャッシュがないため、データ エイリアシングの影響を受けやすくなっています。

于 2013-10-26T13:40:39.453 に答える