📄 catdaoimpl.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 + -