버전 필드를 사용하여 낙관적 잠금을 사용하려고하는데 jpa 저장소에서 저장을 호출해도 예외가 throw되지 않습니다. 나는 봄에 익숙하지 않고 동면하며 나는 그것을 잘못 설정하고 있다고 걱정한다. 내가 사용하고
라이브러리는 다음과 같습니다 hibernate4 - 받는다는 - 플러그인 버전 1.0.2 최대 절전 모드 - jpa02.0 1.0.1 스프링 데이터 JPA 버전 1.3.4버전을 사용하는 Hibernate optimistic 잠금이 작동하지 않습니다.
그래서 내 엔티티는 다음과 같이 설정 :
@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이 발생합니다.
확인했는데 버전이 일치하지 않지만 저장이 여전히 발생합니다. 왜 이런 일이 일어나고 있는지에 대한 도움이 필요하십니까? 업데이트 쿼리가 필요한 경우 쇼 - SQL이 SQL 로깅에 감사
업데이트 코드는 어디에 있습니까? 개체를 업데이트하는 경우 repo에서 saveOrUpdate (object) 메서드를 호출하십시오 – Zeus
자신이 버전을 변경하지 않습니까? 이는 JPA 제공자가 수행해야하는 관리입니다. 이를 테스트하는 적절한 방법은 두 개의 스레드를 생성하는 것인데, 동시에 각각 고유 한 트랜잭션에서 동일한 엔티티를 가져 와서 업데이트합니다. 그 중 하나는 저축 할 때 실패해야합니다. 이것은 커밋하기 전에 스레드에 몇 초간 잠을 자면 쉽게 수행 할 수 있습니다. – Gimby
@Zeus - 업데이트 코드는 jpa 저장소가 저장을 처리하는 곳입니다. – Lumpy