2009-04-23 3 views
0

누구든지 웹 응용 프로그램에 대해 DAO 구현을 제안 할 수 있습니까?최대 절전 모드 DAO 구현

기본 작업 (예 : findByID(), findALL(), createObject(), deleteObject() 등)을위한 트랜잭션을 만들면 어떤 문제가 발생합니까?

지연 작업을 지원하는 DAO 구현을 제안하십시오.

답변

1

Hibernate Tools을 사용하여 코드를 생성하면 기본 DAO가 자동으로 생성됩니다. 당신은 그들 위에 세울 수 있습니다.

어쨌든, 거래에 사용하는 몇 가지 코드는 : 당신의 매핑 및 쿼리에

1) 구성이 제대로 지연로드 :

public void executeTransaction(Object[] parameters, Transact transact) throws ApplicationException 
{ 
    Transaction tx = null; 
    try 
    { 
     tx = HibernateSessionFactory.getSession().beginTransaction(); 
     transact.execute(parameters, tx); 
     tx.commit(); 
     LOG.trace("executeTransaction() success"); 
    } 
    catch (Exception e) 
    { 
     rollback(tx); 
     throw new ApplicationException(e); 
    } 
} 

private void rollback(Transaction tx) throws ApplicationException 
{ 
    LOG.warn("rollback()"); 
    if (tx != null) 
    { 
     try 
     { 
      tx.rollback(); 
     } 
     catch (Exception ex) 
     { 
      LOG.error("rollback() failure",ex);     
     } 
    } 
} 

public interface Transact 
{ 
    public void execute(Object[] parameters, Transaction tx) throws Exception; 
} 

void updateDistrictImpl(final Distretto district) throws ApplicationException, ApplicationValidationException 
{  
try 
{ 
    LOG.trace("updateDistrict[" + distrettoToString(district) + "]"); 

    executeTransaction(new Transact() { 
     public void execute(Object[] parameters, Transaction tx) throws ApplicationException 
     { 
      DistrettoHome DistrettoDAO = new DistrettoHome(); 
      DistrettoDAO.attachDirty(district); 
     } 
     }); 
    LOG.info("updateDistrict[" + distrettoToString(district) + "] success!"); 
} 
catch (ApplicationException e) 
{ 
    LOG.error("updateDistrict() exception: " + e.getLocalizedMessage(), e); 
    throw e; 
} 
} 
+0

나는 게으른 초기화를 할 수 있습니다. – user93796

+0

자세히 설명해 주시겠습니까? 두려운 "Lazy Initialization Exception"을 얻고 있습니까? –

+0

청원은 내가 게으른 초기화 문제를 해결할 수있는 방법을 말해줍니다. 나는 DAO와 같은 계층 구조 레이어에서 변환을 관리하고 싶습니다. – user93796

0

3 개 주 옵션이 있습니다이 항상 아닙니다 가장 쉬운 방법은 DAO를 개발할 때 프리젠 테이션 레이어에서 개체가 어떻게 사용되는지 항상 알지 못하기 때문입니다.

2) OpenSessionInView 패턴 사용 :이 방법을 사용하면 프리젠 테이션 계층에서 관련 객체를 지연로드 할 수 있습니다. 이것은 아마도 약간의 구성 만 필요하기 때문에 가장 쉬운 방법 일 것입니다. 그러나 게으른로드가 꽤 비쌀 수 있으므로 프리젠 테이션 계층에서 뭔가 비명을 지르는 경우 성능 문제가 발생할 수 있으므로주의하십시오. 프리젠 테이션에서 오브젝트를 수정할 수도 있습니다. 즉, 프리 그래밍 오류를 만드는 것이 더 쉽습니다.

3) Hibernate 오브젝트를 값 오브젝트로 변환하는 서비스 계층을 추가하십시오. 이것은 프리젠 테이션에 노출 된 wchi 특성을 제한 할 수 있으므로 가장 정교한 옵션입니다. 서비스 호출을 중심으로 트랜잭션 경계를 유지하므로 서비스 밖에서는 아무 것도 수정되지 않을 것입니다.

모든 경우에 게으른 로딩을 올바르게 구성해야합니다. 그렇지 않으면 성능 문제가 발생할 것입니다.