2010-01-08 4 views
1

문제를 해결했지만 어떻게 작동하는지 더 잘 이해하고 싶습니다.객체를 추적하는 최대 절전 세션

나는 새로운 제품을 생성/초기화하고 카테고리를 컬렉션 (매핑 된 m : m)에 추가 한 다음 트랜잭션을 저장하고 커밋하는 콜렉션을 반복합니다.

for(Blah b : blahs) 
{ 
    session = getcurrensession(); 

    Product p = new Product(1,2,3,4,5); 



    Category c = Dao.GetById(b.categoryId); 

    session.beginTransaction(); 

    p.getCategories().add(c); 
    session.save(p); 

    session.gettransaction.commit(); 
} 

는 지금은 같은 ID를 가진 다른 개체가 이미 추적되고 않다는 오류가, 그래서 벌어지고 중복 오류가 발생했습니다.

나는 그것이 문제였습니다 참으로 분류 객체, 그리고 생각, 그래서 이런 짓을 :

Category c = null; 
forloop 
{ 

.. 

    if(c == null || c.getId() != b.categoryId) 
     c = Dao.GetById(b.categoryId); 

... 

} 

그래서 지금은 다른 ID를 가지고 있으며, 지금 내 프로그램이 작동하지 않는 범주가로드되지 않습니다 벌금.

이 문제는 다른 방법이 있습니까?

최대 절전 모드로 객체를 추적하는 것을 멈추게 할 수있어서 이러한 문제에 대해 걱정할 필요가 없다.

+0

DAO가 위의 반복 코드와 동일한 세션을 사용하고 있습니까? ISession은 UOW - Unit Of Work이며, 당신은 2 단위의 작업을하고 있다는 느낌이 들었습니다. – David

+0

글쎄, 내 DAO는 Session session = HibernateUtil.getSessionFactory()를 사용한다. getCurrentSession(); 그래서 나는 그것이 현재의 세션이라고 생각했지만 나는 그렇지 않다고 생각하니? – mrblah

답변

1

잘 Dao.GetById (b.categoryId); 전달 된 ID로 항상 해당 Category 객체를 반환해야합니다. 어떻게 다른 Category 객체를 가져올 수 있습니까? 두 개의 세션 인스턴스가있는 경우 부실 객체 문제가되는 두 세션에서 동일한 행을 병렬로 업데이트하지 않는 한 문제가 발생하지 않습니다.

관련 문제