树状自关联 hibernate配置,查询

来源:互联网 发布:sql server msde win7 编辑:程序博客网 时间:2024/06/05 12:06

栏目实体
每个栏目有多个子栏目,一个父栏目
一级栏目无父栏目
hibernate配置

package com.france.bean;import java.util.HashSet;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.OrderBy;import javax.persistence.Table;import org.hibernate.annotations.DynamicInsert;import org.hibernate.annotations.DynamicUpdate;@Entity@Table(name = "lanmu")@DynamicUpdate(true)@DynamicInsert(true)public class Lanmu implements java.io.Serializable {    /**     * 栏目 自关联一对多     */    private static final long serialVersionUID = 862821212669955478L;    private Integer id;    private String name;    private String description;    private Lanmu parentLanmu;    private Integer level;    private Set<Lanmu> children = new HashSet<Lanmu>(0);    public Lanmu() {    }    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    @Column(name = "lanmu_id", unique = true, nullable = false)    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getDescription() {        return description;    }    public void setDescription(String description) {        this.description = description;    }    @ManyToOne(fetch = FetchType.LAZY)    @JoinColumn(name = "parentLanmu", nullable = true)    public Lanmu getParentLanmu() {        return parentLanmu;    }    public void setParentLanmu(Lanmu parentLanmu) {        this.parentLanmu = parentLanmu;    }    public Integer getLevel() {        return level;    }    public void setLevel(Integer level) {        this.level = level;    }    @OneToMany(targetEntity=Lanmu.class, mappedBy="parentLanmu", cascade=CascadeType.ALL, fetch = FetchType.EAGER)      @OrderBy("name")    public Set<Lanmu> getChildren() {        return children;    }    public void setChildren(Set<Lanmu> children) {        this.children = children;    }}

查询的时候 本来是参考
MySQL中进行树状所有子节点的查询
但是hibernate已经在对象映射做好了,所以直接根据id得到Lanu对象就可以

@Override    public Lanmu findAllChildrenLanmu(int lanmu_id) {        // TODO Auto-generated method stub        Lanmu root=new Lanmu();        root=lanmuDAO.get(Lanmu.class, lanmu_id);        return root;    }

测试代码:

    @Test    public void testFindAllChildrenLanmu() {        Lanmu root=service.findAllChildrenLanmu(1);        System.out.println(root.getParentLanmu());//得到null        System.out.println("get root ok");        Set<Lanmu> c1=root.getChildren();        Iterator iter=c1.iterator();        while(iter.hasNext()){            Lanmu l= (Lanmu)iter.next();            System.out.printf("lanmu_id:%d,lanmu_name:%s\n",l.getId(),l.getName());        }    }

输出:

Hibernate:     select        lanmu0_.lanmu_id as lanmu_id1_7_0_,        lanmu0_.description as descript2_7_0_,        lanmu0_.level as level3_7_0_,        lanmu0_.name as name4_7_0_,        lanmu0_.parentLanmu as parentLa5_7_0_,        children1_.parentLanmu as parentLa5_7_1_,        children1_.lanmu_id as lanmu_id1_7_1_,        children1_.lanmu_id as lanmu_id1_7_2_,        children1_.description as descript2_7_2_,        children1_.level as level3_7_2_,        children1_.name as name4_7_2_,        children1_.parentLanmu as parentLa5_7_2_     from        lanmu lanmu0_     left outer join        lanmu children1_             on lanmu0_.lanmu_id=children1_.parentLanmu     where        lanmu0_.lanmu_id=?     order by        children1_.name //得到二级栏目 一级栏目(1)和二级栏目节点(3,4)Hibernate:     select        children0_.parentLanmu as parentLa5_7_0_,        children0_.lanmu_id as lanmu_id1_7_0_,        children0_.lanmu_id as lanmu_id1_7_1_,        children0_.description as descript2_7_1_,        children0_.level as level3_7_1_,        children0_.name as name4_7_1_,        children0_.parentLanmu as parentLa5_7_1_     from        lanmu children0_     where        children0_.parentLanmu=?     order by        children0_.name        //得到三级栏目节点(null)(children0_.parentLanmu=3)Hibernate:     select        children0_.parentLanmu as parentLa5_7_0_,        children0_.lanmu_id as lanmu_id1_7_0_,        children0_.lanmu_id as lanmu_id1_7_1_,        children0_.description as descript2_7_1_,        children0_.level as level3_7_1_,        children0_.name as name4_7_1_,        children0_.parentLanmu as parentLa5_7_1_     from        lanmu children0_     where        children0_.parentLanmu=?     order by        children0_.name         //得到另一个三级栏目节点(5)(children0_.parentLanmu=4)Hibernate:     select        children0_.parentLanmu as parentLa5_7_0_,        children0_.lanmu_id as lanmu_id1_7_0_,        children0_.lanmu_id as lanmu_id1_7_1_,        children0_.description as descript2_7_1_,        children0_.level as level3_7_1_,        children0_.name as name4_7_1_,        children0_.parentLanmu as parentLa5_7_1_     from        lanmu children0_     where        children0_.parentLanmu=?     order by        children0_.name        //得到四级栏目节点(null)(children0_.parentLanmu=5)nullget root oklanmu_id:3,lanmu_name:lanmuAAlanmu_id:4,lanmu_name:lanmuAB

数据库数据

lanmu_id description level name parentLanmu 1 NULL 1 lanmuA NULL 2 NULL 1 lanmuB NULL 3 NULL 2 lanmuAA 1 4 NULL 2 lanmuAB 1 5 NULL 3 lanmuABA 4

最后,配置的时候注意fetch = FetchType.EAGER 的使用范围即可

0 0
原创粉丝点击