0

ここで戸惑います。春の休止状態プログラムに楽観的ロックを実装したかったのですが、別のブラウザーでデータを開いて個別に更新しても、休止状態は StaleObjectStateException をスローしません。

私のダオは次のようになります。

public void update(User user) throws StaleObjectStateException{       
sessionFactory.getCurrentSession().saveOrUpdate(user);
}

私のPojoは次のようになります。

@Version@Temporal(TemporalType.TIMESTAMP)
@Column(name="timestamp", length=19)
public Timestamp getTimestamp() {
return this.timestamp;
}

構成.xml

<bean name="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
</bean>
<tx:annotation-driven />
<bean name="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

例外がスローされない理由の 1 つは、データが永続化されているため、更新時に他のセッションのタイムスタンプも更新されることです。助けてください。

ペリー

4

1 に答える 1

0

SpringTransactionManagerを使用しているようです。@Transactionalしたがって、トランザクションを追跡するアノテーションがどこかにあると思います。この場合、それStaleObjectStateExceptionはあなたのクラスのupdateメソッドの実行ではなく、トランザクションがコミットされるときにスローされると思います。また、春は休止状態の例外をにラップすると思いますHibernateOptimisticLockingFailureException@Transactionalしたがって、アノテーションでマークされたメソッドにthrows宣言を追加する必要があります。トランザクションアノテーションがない場合は、Daoでトランザクションアノテーションを追加するか、手動のトランザクション処理を使用する必要があります。

于 2013-03-11T08:52:25.810 に答える