0

任何人都可以建议 Web 应用程序的 DAO 实现吗?

如果我为基本操作(例如findByID(), findALL(), createObject(),deleteObject()等)创建事务会出现什么问题?

请建议一个支持惰性操作的 DAO 实现。

4

2 回答 2

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;
}
}
于 2009-04-23T12:40:35.497 回答
0

有 3 个主要选项:

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

2) 使用 OpenSessionInView 模式:这样,您将能够在表示层中延迟加载相关对象。这可能是最简单的方法,因为它只需要一点点配置。但是要小心,因为延迟加载可能会非常昂贵,如果您在表示层中做了一些可疑的事情,您可能会遇到性能问题。您还可以从演示文稿中修改您的对象,这意味着更容易出现预编程错误。

3) 添加一个服务层,将您的 Hibernate 对象转换为值对象:这是最细粒度的选项,因为您还可以限制 wchi 属性暴露给演示文稿。您在服务调用周围保持事务边界,因此您可以确定在服务之外不会修改任何内容。

在所有情况下,您至少应该尝试正确配置延迟加载。否则你可能会遇到性能问题!

于 2009-04-23T12:59:15.187 回答