2011-05-11 5 views
0

HibernateDaoSupportgetSession()을 사용하여 몇 가지 큰 문제를 일으켰습니다. 이제 수정 해 보려고합니다.이 추상적 분류를 작성하고 모든 Dao가 각 Dao에 SessionFactory을 추가하는 대신 확장해야하는지 궁금합니다. ?각 DAO 또는 확장 클래스의 Hibernate의 SessionFactory?

그렇다면,이 추상적 인 Dao 클래스의 bean을 생성하고 세션 팩토리를 전달하면 다른 Dao가 그것을 확장 한 후에 작업 할 수 있습니까? 아니면 불가능한가?

public abstract class AbstractDAOImpl<T> implements 
     AbstractDAO<T> { 

    private static Logger _logger = LoggerFactory 
            .getLogger(AbstractDAOImpl.class); 
    private SessionFactory factory; 

    @Override 
    public void refresh(final T object) { 
     try { 
      factory.getCurrentSession().refresh(object); 
     } catch (Exception e) { 
      _logger.error("Cannot refresh object " + object, e); 
     } 
    } 

    @Override 
    public void remove(final T object) { 
     try { 
      factory.getCurrentSession().delete(object); 
     } catch (Exception e) { 
      _logger.error("Cannot remove object " + object, e); 
     } 
    } 

    @Override 
    public void save(final T object) { 
     try { 
      factory.getCurrentSession().saveOrUpdate(object); 
     } catch (Exception e) { 
      _logger.error("Cannot save or update object " + object, e); 
     } 
    } 

} 
+0

나는 이것이 훨씬 더 좋은 방법이라고 말할 수 있습니다. 여러 프로젝트에서 비슷한 추상 루트 DAO 클래스를 사용했습니다. – fmucar

+0

@fmucar, okay 그리고 root dao 클래스에서 sessionFactory를 얻으려면 bean을 만들고 sessionFactory를 전달해야합니다. 또는 루트 DAO 클래스를 확장 할 때 각 DAO 클래스가 다른 인스턴스를 작성하기 때문에 작동하지 않습니다. – Rihards

+0

나는 스프링을 사용하여 sessionfactory 인스턴스가 스프링 컨텍스트에서오고 자동으로 주입되도록했다. 따라서 DI를 사용하고 있지 않다면 세션 팩토리에 대한 참조를 유지하고 생성시 DAO에 전달해야합니다. – fmucar

답변

2
public interface RootDAO<T> extends Serializable { 

    public List<T> loadAll(); 

    public T save(T entity); 

    public void delete(T entity); 

    public void markAsDeleted(T entity); 

    public T get(Serializable id); 

    public T load(Serializable id); 

    public void saveOrUpdate(T entity); 

    public void deleteAll(Collection<T> entities); 

    public void saveOrUpdateAll(Collection<T> entities); 

    public List<T> find(String hql); 

    public void update(T entity); 

    public T getByExampleUnique(T entity); 

    public List<T> getByExampleList(T entity); 

    public List<T> listAll(); 

    public Object execute(HibernateCallback action); 

    public List<T> findByNamedParam(String queryString, String paramName,Object value); 

    public List<T> findByNamedParam(String queryString, String[] paramNames,Object[] values); 
    . 
    . 
    . 
    . 

} 

@Component 
public abstract class RootDAOImpl<T> extends HibernateDaoSupport implements RootDAO<T> { 


    protected Logger logger = LoggerFactory.getLogger(getClass()); 
    private Class<T> clazz; 

    @Autowired 
    public void init(SessionFactory factory) { 
     setSessionFactory(factory); 
    } 

    public RootDAOImpl(Class<T> clazz) { 
     this.clazz = clazz; 
    } 

    public void delete(T entity) { 
     getHibernateTemplate().delete(entity); 
    } 

    public void delete(String id) { 
     getHibernateTemplate().delete(new FbUser(id)); 
    } 

    public void markAsDeleted(T entity) { 
     // Mark entity as deleted 
     try { 
      Method setDeletedMethod = clazz.getDeclaredMethod("setDeleted", Boolean.class); 
      setDeletedMethod.invoke(entity, true); 
      getHibernateTemplate().saveOrUpdate(entity); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     // actually delete 
     // getHibernateTemplate().delete(entity); 
    } 

    @Override 
    public void deleteAll(Collection<T> entities) { 
     getHibernateTemplate().deleteAll(entities); 
    } 

    @Override 
    public void saveOrUpdateAll(Collection<T> entities) { 
     getHibernateTemplate().saveOrUpdateAll(entities); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public T get(Serializable id) { 
     return (T) getHibernateTemplate().get(clazz, id); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public T load(Serializable id) { 
     return (T) getHibernateTemplate().load(clazz, id); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public List<T> find(String hql) { 
     return (List<T>) getHibernateTemplate().find(hql); 
    } 

    @Override 
    public Object execute(HibernateCallback action) { 
     return getHibernateTemplate().execute(action); 
    } 


    . 
    . 
    . 

} 

@Repository 
public class UserDAOImpl extends RootDAOImpl<User> implements UserDAO{ 


    public UserDAOImpl() { 
     super(User.class); 
    } 
} 

당신이 DI 프레임 워크를 사용하지 않는 당신이 DAO를 만들 때 자신을 SessionFactory에 대한 참조를 유지하고 통과해야 할 수 있습니다 예.

+0

감사합니다. 확실히 이것을 시도해보십시오! – Rihards

1

사람들이 JPA 구현을 최대 절전 모드로 사용하는 이유입니다. 가능한 가장 좋은 디자인 패턴으로 SessionFactory를 활용하는 JPA의 EntityManager 만 사용하면됩니다. 여기서 전체 디자인 패턴을 재발 명할 필요는 없습니다. 다음 예와 같이 각 DAO에서 EntityManager의 CRUD 작업 만 사용하면됩니다. 귀하의 구현에 최선을 다하십시오.

http://www.myhomepageindia.com/index.php/2009/04/02/jpa-hibernate-with-oracle-on-eclipse.html

+0

에 대한 아래의 게시물을 참조하십시오. 코멘트에서 읽었을 때 가장 좋은 예는 아닙니다 .. – Rihards

+0

댓글이 잘못되었습니다. EntityManagerFactory는 인터페이스이며 Persistence 부트 스트랩 클래스를 사용하여 지속성 구성의 인스턴스를 가져옵니다. 이를 이해하려면 JPA의 구현을 검토해야합니다. 이것은 SessionFactory와 그것의 널리 사용되는 팩토리 인스턴스화를 사용하는 효과적인 방법입니다. 그래서이 방법을 사용하는 것이 좋습니다. 만약 누군가가 이것이 잘못된 것이라고 말하면, 올바른 방법이 무엇인지를 보여주지 않고, 그런 코멘트는 중요하지 않습니다. – reddyvaribabu

관련 문제