2009-04-23 148 views
0

任何人都可以提出一个Web应用程序的DAO实现吗?休眠DAO实现

会有什么问题,如果我创建一个基本动作的交易(例如findByID()findALL()createObject()deleteObject()等)?

请表明支持懒惰操作的DAO实现。

回答

1

如果使用Hibernate Tools可以生成代码的基本DAO将自动为您生成。你可以建立在他们身上。

总之,我使用交易的一些代码片段:

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

我有懒intialization – user93796 2009-04-23 12:43:15

0

主要有3个选项:

1)配置正确延迟加载在你的映射,并在查询:这是不是总是最简单的方法,因为在开发DAO时,您始终不知道如何在表示层中使用对象。

2)使用OpenSessionInView模式:通过这种方式,你将能够在表示层延迟加载相关的对象。这可能是最简单的方法,因为它只需要一点点配置。但要小心,因为延迟加载可能会非常昂贵,并且如果在表示层中执行某些操作可能会遇到性能问题。您也可以从演示文稿修改对象,这意味着更容易发生编程错误。

3)添加你的Hibernate对象转换为值对象服务层:这是最细粒度的选择,因为你还可以限制wchi特性暴露到演示文稿。您在服务调用周围保留事务边界,因此您确信在服务之外不会有任何修改。

在任何情况下,你至少应该尝试正确配置懒加载。否则,你可能会遇到性能问题!