高手来领分,hibernate递归遍历树及读取到list中的数据交互
谢谢各位高人,我已经弄了接近20小时,接近崩溃边缘,恳请您指教!
1. 思路和数据结构
目标: 在从hibernate取出数据时应用一个递归算法进行排序,按照节点的父子层次排序得到一个能很好操作的list。总之就是得到一个良好树状顺序的list。并和hibernate进行数据交互。
已经在hbm.xml中进行了双向映射,映射中已经得到了Subject getSuperSubect(),Set getSubSubject;
主要数据结构:
class Subject;{ //就这样表示了
private Integer id; //本科目节点
private String subjectCode;
private String subjectName;
private Integer level;//在树中的层次
private Integer super_parent_id; //父节点
}
##########################################################################
2. 对hibernate数据库操作类: DbOperate
package atis.db;
/**
* 20070105
*/
import atis.util.DBUtil; //导入数据访问工具类
import atis.db.Subject;
public class DbOperate {
/**
* 返回所有的科目记录
*/
public List getAllSubjects() throws HibernateException{
Session session = DBUtil.CurrentSession();
Transaction tx = session.beginTransaction();
String sql = " select s from Subject as s "; //查询对象属性语句
Query query = session.createQuery(sql);
List list = query.list();
tx.commit();
DBUtil.closeSession();
return list;
}
//得到根节点
public Subject getRootSubject() throws HibernateException{
Subject subject = null;
Session session = DBUtil.CurrentSession();
Transaction tx = session.beginTransaction();
//Subject subject = new Subject();
String sql = " select s from Subject as s where s.level = :id " ; //查询对象属性语句
Query query = session.createQuery(sql);
query.setInteger( "id ", 0);
List list = query.list();
if (!list.isEmpty())
subject = (Subject)list.get(0);
else {
Console.print( "没有取到东西_ ");
}
Console.print( "____________ " + subject.getId());
tx.commit();
DBUtil.closeSession(); //关闭
return subject;
}
}
##########################################################################
3. 递归获得list,但是这样写肯定是错误的。。应该怎样操作?怎样传值或者对象?
package atis.db;
import atis.db.Subject;
/**问题就在这里了,我不知道这样写对不对!如何取到Hibernate的数据并使用递归方法操作它们?
* 获得科目的树型列表并存储在list中
*
*
*/
public class SubjectList {
/**
* 递归方法返回一个放置对象的list中的一个按级别排序的list
* @param rootSubect: 根节点开始搜索 ,
* @return
*/
public List findAllChildrenSubjectsList(Subject rootSubect, List list){
if (rootSubect.getSubSubjects().size() == 0) { //无子集
Console.print( "__没有取到东西___ ");
return list;
} else {
for (Iterator it = rootSubect.getSubSubjects().iterator(); it.hasNext(); ) {
Subject theSubject = (Subject) it.next();
list.add(theSubject);
findAllChildrenSubjectsList(theSubject, list);
}
return list;
}
}
/**调用递归函数得到一个排序完整的list
*
*
*/
public List getSubjectList(Subject root) {
List list1 = new ArrayList();
//List list2 =new ArrayList();
return findAllChildrenSubjectsList(root, list1);
}
}
##########################################################################
4. JSP操作:
<% DbOperate db = new DbOperate();
List list =db.getAllSubjects();// new ArrayList();
out.println( " <b> 共有 "+ list.size()+ " 条记录 </b> ");
for (Iterator it = list.iterator(); it.hasNext(); ){
Subject ss = (Subject)it.next();
%>
<tr>
<td> <%=ss.getId()%> </td>
<td> <%=ss.getSubjectCode()%> </td>
<td> <%=ss.getSubjectName()%> </td>
<td width= "100 "> 查看详情 </td>
<td width= "100 "> 编辑 </td>
<td width= "100 "> 删除 </td>
<td width= "100 "> 添加子分类 </td>
</tr>
<% } %>
<%
Subject rootSubject = db.getRootSubject();
%>
<%=rootSubject.getId()%>
#########################################################################
5. JSP中编辑跳转问题
若遍历成功后显示每条记录后都有这条记录对应的“编辑”“删除”按钮,点击后将会跳转到相应的jsp页面,在list中的数据对象如何传递下个页面中去?又如何写入或者读取hibernate?
[解决办法]
看的不是太仔细,你的意思是要求一个多叉树型的数据结构以及对应的hibernate持久层操作是吧?
多叉树型的数据结构必须采用composite模式,其实模式就是个沟通用语,我说composite模式意思就是其数据结构应该是一个节点类、它持有一个子节点集合(里面放的还是节点类)、它还具有至少一个对自己的子节点集合递归的操作方法。
这里面的问题在于你的父节点对应的数据库记录和子节点对应的数据库记录应该全放在一张表里(因为你既然用递归,那么就表示节点数不限),也就是说就一个通用节点类,以一个层数字段标识自己的层深、一个父ID标识自己的父、可能还有一个是否是叶的字段。既然全放在一张表,那些个one-to-many对应也就不需要了,用hibernate保存只要一个通用保存方法即可,就是节点的保存方法。不知道我说的是否对题。
[解决办法]
LZ好象是在做无限级的生成树吧.
我是用JAVA来写的,只读取一次数据库,然后再递归生成树.记得每次用前把静态变量re1清空.
.用HIBERNATE 你照着推就OK了
public static List getAll() //得到顺序表
{
List result=new ArrayList();
DBConnection db=new DBConnection();
Connection conn=db.getConn();
try
{
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery( "select * from Class ");
while(rs.next())
{
Node n=new Node();
n.setId(rs.getInt( "ClassID "));
n.setName(rs.getString( "ClassName "));
n.setParentid(rs.getInt( "ParentID "));
n.setLevel(rs.getInt( "Leve "));
result.add(n);
}
return result;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
static List re1=new ArrayList();//用来返回结果的数组
// 递归生成树
public static List getTree(Node node,List treeList)
{
//rr.add(node);
//System.out.println(node.getName());
if(!node.isLeaf())
{
List ss=getSubing(node);
for(int i=0;i <ss.size();i++)
{
Node n=(Node)ss.get(i);
re1.add(n);
//System.out.println(n.getName()+ " "+n.getParentid()+ " "+n.getId()+ " "+n.getLevel());
getTree(n,treeList);
}
}
else
{
re1.add(node);
//System.out.println(node.getName()+ " "+node.getParentid()+ " "+node.getId());
}
return re1;
}
[解决办法]
发了,来领分