⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 catdaoimpl.java

📁 sping下勇Xdoclet开发hibernate的程序实例,版本hibernate2.0,开发工具eclipse3.0
💻 JAVA
字号:
package org.ggyy.dao.hibernate;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Stack;
import org.ggyy.bo.Cat;
import org.ggyy.dao.ICatDao;
import org.ggyy.dao.IVisit;
import org.springframework.dao.DataAccessException;

/**
 * @spring.bean id ="catDaoTarget"
 * @spring.property name="sessionFactory" ref="sessionFactory"
 */
public class CatDaoImpl extends EntityDaoImpl implements ICatDao {
    /**
     * 需要readonly的事务,是为了解决Hibernate的延迟加载问题.
     */
    public List findAllChildren(String catId) throws DataAccessException {
        final List children = new ArrayList();
        this.treeVisitCat(catId, new IVisit() {
            public void visit(Cat c) {
                children.add(c);
            }
        });
        return children;
    }

    /**
     * 我给treeVisitCat这个方法配置了一个readonly的事务,并不是因为这个方法需要事务,而是为了解决延迟加载的问题.
     * 在本系统里,所有的一对多都是cascade="all" inverse="true" lazy="true";
     * 所有的的多对一都是cascade="save-update".主表类不负责从表类的加载,也不负责维护主从关系,这样的做我感觉性能是最好的.
     * 但由于lazy="true",下面这个方法的cat.iterator()再往下运行就出错了(是因为延迟加载的问题).但给它配置一个事务就不同了,
     * 有了事务上下文(我也不知道是不是这样称呼),就有HibernateSession的上下文,这样就不会有延迟加载的问题啦.这样的做法有点无耻,
     * 为了弥补性能的损失,我只好做成readonly了.对于这种query,使用OpenSessionInView也行,但这样HibernateSession不好控制.
     * 经过思考,我认为最好方法是使用AOP给它配置一个HibernateSession的上下文,也就是使用AOP来拦截,可惜我不会^_^.
     *  
     */
    public void treeVisitCat(String catId, final IVisit visit)
            throws DataAccessException {
        Cat catt = (Cat) getHibernateTemplate()
                .load(Cat.class, new Long(catId));
        Stack s = new Stack();
        s.push(catt);
        while (s.empty() == false) {
            Cat c = (Cat) s.pop();
            visit.visit(c);
            Set children = c.getChildren();
            if (children != null && !children.isEmpty()) {
                Iterator ci = children.iterator();
                while (ci.hasNext()) {
                    Cat cc = (Cat) ci.next();
                    s.push(cc);
                }
            }
        }
    }

    protected Class getEntityClass() {
        return Cat.class;
    }

    public List findDirectChildren(String catId) throws DataAccessException {

        return this.getHibernateTemplate().find(
                "select cat from Cat as cat where cat.parent.id=?",
                new Long(catId));
    }

    public List findRootCats() throws DataAccessException {

        return this.getHibernateTemplate().find(
                "select cat from Cat as cat where cat.parent is null");
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -