Hibernate DAO实现

时间:2009-04-23 12:20:29

标签: hibernate dao

有人可以为网络应用程序建议DAO实现吗?

如果我为基本操作创建交易会有什么问题(例如findByID()findALL()createObject()deleteObject()等?)

请建议支持延迟操作的DAO实现。

2 个答案:

答案 0 :(得分: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;
}
}

答案 1 :(得分:0)

有三个主要选项:

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

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

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

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