首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

高手来领分,hibernate递归遍历树及读取到list中的数据交互,该怎么处理

2012-01-11 
高手来领分,hibernate递归遍历树及读取到list中的数据交互谢谢各位高人,我已经弄了接近20小时,接近崩溃边

高手来领分,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;
}

[解决办法]
发了,来领分

热点排行