문제

최대 절전 모드에서 게으른 초기화 문제를 해결하기 위해 다음 접근법을 사용하고 있습니다. 그것이 작동하는지 아닌지 알려주세요. 몇 가지 이유로 인해 지속성 계층의 강제에서 트랜스 세이션을 구현해야합니다.

public class CourseDAO {

    Session session = null;

    public CourseDAO() {
        session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public Course findByID(int cid) {
        Course crc = null;
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Query q = session.createQuery(
                "from Course  as course where course.cid = "+cid+" "
            );
            crc = (Course) q.uniqueResult();
            //note that i am not commiting my transcation here.
            //Because If i do that i will not be able to do lazy fetch
        }
        catch (HibernateException e) {
            e.printStackTrace();
            tx.rollback();
            throw new DataAccessLayerException(e);
        }
        finally {
            return crc;
        }
    }

}

그리고 필터에서 나는 folling 코드를 사용하고 있습니다.

session = HibernateUtil.getSessionFactory().getCurrentSession(); 
if(session.isOpen())
    session.getTransaction().commit();

이 접근법이 맞습니까? 문제가있을 수 있습니다.

도움이 되었습니까?

해결책

항상 커밋하거나 롤백 한 다음 항상 세션을 닫아야합니다. 기본적으로, 귀하의 리소스 (거래 및 세션)는 무엇이든간에, 예를 들어, 세션의 경우 적절한 최종 블록 (세션의 경우) 또는 시도 및 캐치 블록 (트랜잭션의 경우) 내부에 배치 할 수 있습니다.

일반적으로, 다른 응용 프로그램 계층에서 자원을 할당하고 출시하는 것은 반포 팬입니다. 아키텍처가 방지 방지를 적용하도록 강요하면 여기에 더 많은 질문이 있습니다 ... 예를 들어, 당신이해야 할 일을 생각해보십시오. " 필터 "세션이 닫힌 경우 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top