RT,由相关的实例吗?请各位指点一下,做项目的时候,卡住了。

解决方案 »

  1.   

    呵呵,搞掂了,用递归,给点思路大家!实体类代码:package com.choogoo.pojo;import java.io.Serializable;
    import java.util.Set;import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;@Entity
    @Table(name="catalog")
    public class Catalog implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column
    private String name;
    @ManyToOne
    @JoinColumn(name="parent_id")
    private Catalog catalog;

    @OneToMany(mappedBy="catalog",cascade=CascadeType.ALL)
    private Set<Catalog> catalogs; public Long getId() {
    return id;
    } public void setId(Long id) {
    this.id = id;
    } public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public Catalog getCatalog() {
    return catalog;
    } public void setCatalog(Catalog catalog) {
    this.catalog = catalog;
    } public Set<Catalog> getCatalogs() {
    return catalogs;
    } public void setCatalogs(Set<Catalog> catalogs) {
    this.catalogs = catalogs;
    }
    }
    测试类:package com.choogoo.test;import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;import org.hibernate.Query;
    import org.hibernate.Session;import com.choogoo.pojo.Catalog;
    import com.choogoo.util.HibernateSessionFactory;public class Test {
    public static void main(String[] args) {
    long parentid=0;
    int level=0;
    getALLCatalog(parentid,level); } public static void getALLCatalog(long parentid, int cataloglevel) {
    String hql ="";
    if (parentid==0) {
    hql = "from Catalog as c where c.catalog.id is null";
    } else {
    hql = "from Catalog as c where c.catalog.id="+parentid;
    }
    Session session = null;
    List list = new ArrayList();
    int level=cataloglevel;
    try {
    session = HibernateSessionFactory.getSession();
    Query q = session.createQuery(hql);
    list = q.list();
    level+=1;
    for (int i = 0; i < list.size(); i++) {
    Catalog catalog = (Catalog) list.get(i);
    for (int j = 0; j < level; j++) {
    System.out.print("  ");
    }
    System.out.println("|---"+catalog.getName());
    getALLCatalog(catalog.getId(),level);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    Hibernate的配置文件:<?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools.                   -->
    <hibernate-configuration><session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">admin</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/unlimit</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <mapping class="com.choogoo.pojo.Catalog" />
    </session-factory>
    </hibernate-configuration>
    由于是测试代码,没有分层写DAO,大家有需要可以拓展。
    呵呵,目前网上介绍的例子很少,所以贴出来分享。希望能帮助大家。
      

  2.   

    建议使用此代码开启Hibernate的二级缓存。能极大提高查询性能!
      

  3.   

    不是二级缓存的问题,这种无限分类如果这么实现性能就太差了
    一般的做法是一次性按parentid排序全部查询出来,这样就会按从根节点到最末的叶节点按层一层一层出来了
    然后再这个排好序list的基础上再递归或者其他什么的操作,减少对数据库的访问次数
      

  4.   

    其实也是明白的,但使用Hibernate和直接使用SQL的处理方式不一样。
    或者兄弟给个实例,让我们学习下,如何?
      

  5.   

    高人指点后,实体类变更如下,主要关闭延时加载。在读取第一条HQL的时候,把所有内容都加载后,再递归。package com.choogoo.pojo;import java.io.Serializable;
    import java.util.Set;import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;@Entity
    @Table(name="catalog")
    public class Catalog implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column
    private String name;
    @ManyToOne
    @JoinColumn(name="parent_id")
    private Catalog catalog;

    @OneToMany(mappedBy="catalog",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    private Set<Catalog> catalogs; public Long getId() {
    return id;
    } public void setId(Long id) {
    this.id = id;
    } public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public Catalog getCatalog() {
    return catalog;
    } public void setCatalog(Catalog catalog) {
    this.catalog = catalog;
    } public Set<Catalog> getCatalogs() {
    return catalogs;
    } public void setCatalogs(Set<Catalog> catalogs) {
    this.catalogs = catalogs;
    }
    }package com.choogoo.test;import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;import org.hibernate.Query;
    import org.hibernate.Session;import com.choogoo.pojo.Catalog;
    import com.choogoo.util.HibernateSessionFactory;public class Test {
    public static void main(String[] args) {
    long parentid=0;
    int level=0;
    getALLCatalog(parentid,level); } public static void getALLCatalog(long parentid, int cataloglevel) {
    String hql ="";
    if (parentid==0) {
    hql = "from Catalog as c where c.catalog.id is null";
    } else {
    hql = "from Catalog as c where c.catalog.id="+parentid;
    }
    Session session = null;
    List list = new ArrayList();
    int level=cataloglevel;
    try {
    session = HibernateSessionFactory.getSession();
    Query q = session.createQuery(hql);
    list = q.list();
    for (int i = 0; i < list.size(); i++) {
    Catalog catalog = (Catalog) list.get(i);
    printAllCatalog(level, catalog);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    } private static void printAllCatalog(int level, Catalog catalog) {
    for (int j = 0; j < level; j++) {
    System.out.print("  ");
    }
    System.out.println("|---"+catalog.getId()+"_"+catalog.getName());
    Set<Catalog> catalogs=catalog.getCatalogs();
    Iterator irs = catalogs.iterator();
    level+=1;
    while(irs.hasNext()){
    Catalog c = (Catalog)irs.next();
    printAllCatalog(level, c);
    }
    }
    }