我想使用版本字段的樂觀鎖定,並且當我從jpa存儲庫調用保存時不會引發異常。我對Spring和冬眠是新手,我擔心我設置不正確。
我使用的庫是: hibernate4 Maven的插件版本1.0.2 休眠-jpa02.0 1.0.1 彈簧數據的JPA版本1.3.4Hibernate樂觀鎖定使用版本不起作用
所以我的實體建立這樣:
@Entity
public class MyEntity
{
@Id
protected Long id;
@Version
protected Long version;
protected String name;
public Long getVersion()
{
return version;
}
public void setVersion(Long version)
{
this.version = version;
}
public Long getVersion()
{
return version;
}
public void setVersion(Long version)
{
this.version = version;
}
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(Long id)
{
this.name = name;
}
}
我通過我的DTO通過對客戶端傳遞版本,並將它傳遞回來時,我做了保存在我的MyEntityStoreDao:
@Repository
public class MyEntityStoreDao extends BaseDao<MyEntityStoreDao>
{
private RepositoryManager myRepoManager;
@Autowired
public void setMyRepo(MyEntityRepository myRepo)
{
this.myRepo = myRepo;
}
public MyEntity save(MyEntityDTO dtoToUpdate)
{
Session session = this.Session();
MyEntity myEntity = new MyEntity();
if(dtoToUpdate.getId() > 0) {
myEntity = (MyEntity) session.get(MyEntity.class, dtoToUpdate.getId())
}
myEntity.setName(dtoToUpdate.getName());
MyEntity result = this.myRepo.save(myEntity);
this.repositoryManager.flush(myRepo);
}
}
的repositoryManager在BaseDao中,正在使用org.springframework.data.jpa.repository.JpaRepository
。
版本正在正確更新並正在增加。但是當我進行更新時,我期望從DTO傳遞的版本保存在MyEntityStoreDao中,以便與數據庫中的內容不匹配時,它將引發StaleStateException或OptmisticLockingException。
我檢查和版本不匹配,但保存仍然發生。任何幫助,爲什麼發生這種情況?由於
您的更新代碼在哪裏?如果你正在更新一個對象,請在repo上調用saveOrUpdate(object)方法 – Zeus
你不是自己改變版本嗎?這是JPA提供商應該做的管理工作。測試這種方法的正確方法是創建兩個線程,每個線程同時在自己的唯一事務中獲取並更新同一個實體;其中一個應該在保存時失敗。通過在提交之前在線程中進行幾秒鐘的休眠,這很容易實現。 – Gimby
@Zeus - 更新代碼是jpa存儲庫處理保存的地方。 – Lumpy