2012-03-12 3 views
3

DI 용으로 Spring을 사용하고, mySQL 데이터베이스에서 데이터 액세스를 위해 Hibernate를 사용하고있다. 테이블에 레코드를 삽입 한 다음 트랜잭션 테이블에 쿼리를 실행하고 집계 계산을 수행하는 코드를 실행하는 코드가 있습니다. 내가 보는 문제는 방금 삽입 한 레코드가 동일한 트랜잭션 중에 뷰의 계산 된 값에 포함되지 않는다는 것입니다. mySQL 워크 벤치에서 동일한 뷰를 실행하고 삽입 된 값이 뷰에 포함됩니다. 누구든지이 원인을 알고 있습니까?트랜잭션 (Hibernate/Spring) 내에서 mysql 뷰가 새로 고침되지 않는다.

답변

5

궁극적으로 필자는 entityManager.refresh (Object entity)를 호출하여 업데이트하려는 뷰 레코드의 엔티티를 새로 고쳐야했습니다. 나는이 문제가 Hibernate가 갱신 된 원래 엔티티에 (데이터베이스 레벨에서) 의존한다는 것을 알지 못하기 때문에 뷰를 갱신해야한다는 것을 인식 할 수 없다는 사실에 문제가 있다고 생각한다. 나는 Hibernate가 뷰에서 레코드를 캐싱하고 flush() 후에도 업데이트가 필요하다는 것을 알지 못한다고 추정한다.

Hibernate는 원래의 테이블과 뷰를 완전히 무관하다고 본다. 실제로 뷰는 테이블에 의존하고 테이블이 변경 될 때마다 "더티"되어야한다. 나는 Hibernate가 그것을 인식하도록하는 방법을 모른다.

+0

테이블에서 일부 레코드를 삭제 한 후 세션 목록 및 쿼리 목록보기를 사용하면 어떻게 수행 할 수 있을지 궁금합니다. –

2

아마도 데이터베이스에 변경 사항을 플러시하지 않았을 것입니다. Hibernate는 열을 삽입 한 테이블과 나중에 읽는 뷰 사이에 연결이 있다는 것을 모릅니다. 보기를 조회하기 전에 entitymanager (또는 세션 또는 템플리트)를 플러시하십시오.

+0

플러시가 작동하지 않았습니다. EntityManager에서 새로 고침 메서드를 호출하여 데이터베이스에서 변경 내용을 새로 고쳐야했습니다. –

+0

이것이 캐시 문제인지 궁금합니다. –

1

이는 대부분 MySQL의 기본 격리 수준 인 REPEATABLE READ으로 인해 발생합니다.

즉, 트랜잭션이 발생하기 전까지는 MySQL Workbench에서 트랜잭션이 변경되지 않습니다. SELECT를 실행하면 트랜잭션으로 간주됩니다.

MySQL Workbench에서 커밋 (또는 롤백)을 실행하면 변경 사항을 볼 수 있습니다.

당신은 아마 READ COMMITTED에 설치의 기본 격리 수준 중 하나를 변경하거나 그 매뉴얼에서 찾을 수 있습니다 할 방법에 READ COMMITTED

세부 사항에 MySQL의 워크 벤치에서 세션의 격리 수준을 변경하고 싶습니다.

+1

은 READ COMMITTED 및 READ-UNCOMMITTED를 시도했지만 문제를 해결하지 못했습니다. –