私はすでにフォーラムで検索していますが、成功せずに多くのことを試しました。
トランザクションメソッドの最後で、最後にのみ、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.
助けてくれますか?