2017-03-20 25 views
2

オプティミスティック・ロック・アノテーションは機能しません。Springデータのオプティミスティック・ロックを無効にする方法JPA

public interface TestRepository<TestEntity, Long> extends JpaRepository<Version, Long> { 
    @Lock(LockModeType.NONE) 
    TestEntity findByName(String name); 
} 

だから、私は呼び出そう:

entityManager.refresh(); 

それは動作しますが、それはこの問題を回避するだ

@OptimisticLocking(type = OptimisticLockType.NONE) 
public class TestEntity { 
    .... 
} 

@Lock注釈はどちらか動作しません。

EntityManager em = sharedEntityManagerBean.getObject(); 
em.refresh(testEntity, LockModeType.OPTIMISTIC); 
testRepository.save(testEntity); 

楽観的ロック注釈が動作しない理由を教えてくださいし、最新のデータをDB行(エンティティ)を更新するための最良の方法は何ですか?でしたか

+0

私はこれをhttp://springinpractice.com/2013/09/14/optimistic-locking-with-spring-data-restと助けてくれると思います – Reborn

答えて

2

OptimisticLockType.NONEは、TestEntityのデフォルトのオプティミスティックロックメカニズムを無効にします。

あなたが@MappedSuperclassまたは@Inheritanceでアノテートされた基本クラスから@Versionプロパティを継承している場合しかし、それだけで有用であろう。

このエンティティに対してオプティミスティックロックを必要としない場合は、@Versionプロパティを削除するだけで済みます。しかし、それは通常lost updatesになる可能性があるため、悪い考えです。

重複しないプロパティー・チャネージによって生成された競合率を低下させる可能性があるversionless optimistic lockingを使用したいことがあります。

また、@Lock(LockModeType.NONE)は、デフォルトで暗示されているため、役に立たないものです。あなたもそれを削除することができます。これはacquiring an explicit logical or physical lockの場合のみです。

あなたは、オプティミスティックロックがあなたが記述していない問題を引き起こしていると誤った結論を導いています。

したがって、それは明らかだように、適切な方法で質問を策定する必要があります。

  1. あなたが解決しようとしている実際の問題とは何ですか?
  2. オプティミスティックロックが必要かどうか
  3. 保存を行う際に特別な例外はありますか?
+0

@Versionプロパティは削除されましたが、エンティティロックモードは楽観的。 --- 1.問題は、マルチリクエストからのオプティミスティックロック例外です。 2.私は、アプリケーション管理の同時実行性を使用したくありません。 3.この状況でテストケースをアップロードしました。 https://github.com/pilkyoon/optimisticlocking – pilkyoon

+0

あなたのMappedSuperclassアノテーションの例を参照すると、バージョン4.3.0.Finalより前のHibernateは、親クラスにVersion注釈付きプロパティがある場合、OptimisticLockType設定を無視することに気付きました。 – pbartosz

+0

多分それは修正されたバグでした。 –

関連する問題