当前位置:编程学习 > JAVA >>

hibernate树形结构

树形结构:也就是目录结构,有父目录、子目录、文件等信息,而在程序中树形结构只是称为节点。
         一棵树有一个根节点,而根节点也有一个或多个子节点,而一个子节点有且仅有一个父节点(当前除根节点外),而且也存在一个或多个子节点。
         也就是说树形结构,重点就是节点,也就是我们需要关心的节点对象。
         节点:一个节点有一个ID、一个名称、它所属的父节点(根节点无父节点或为null),有一个或多的子节点等其它信息。
Hibernate将节点抽取出成实体类,节点相对于父节点是“多对一”映射关系,节点相对于子节点是“一对多”映射关系。
一、  节点实体类:
[java] 
/** * 节点*/ 
public class Node { 
    private int id; //标识符 
    private String name; //节点名称  
    private int level; //层次,为了输出设计    
    private boolean leaf; //是否为叶子节点,这是为了效率设计,可有可无 
    //父节点:因为多个节点属于一个父节点,因此用hibernate映射关系说是“多对一” 
    private Node parent; 
    //子节点:因为一个节点有多个子节点,因此用hibernate映射关系说是“一对多” 
    private Set children; 
  
    public int getId() {return id;} 
    public void setId(int id) {this.id = id;} 
    public String getName() {return name;} 
    public void setName(Stringname) {  this.name = name;} 
    public int getLevel() { return level;} 
    public void setLevel(int level) {this.level = level;} 
    public boolean isLeaf() {return leaf;} 
    public void setLeaf(boolean leaf) {this.leaf = leaf;} 
    public Node getParent() {return parent;} 
    public void setParent(Nodeparent) {this.parent = parent;} 
    public SetgetChildren() {return children;} 
    public void setChildren(Setchildren) {this.children = children;} 


二、  xml方式:映射文件:
 
[html] 
<class name="com.wjt276.hibernate.Node" table="t_node"> 
      <id name="id" column="id"> 
          <generator class="native"/> 
      </id> 
      <property name="name"/> 
      <property name="level"/> 
      <property name="leaf"/> 
<!— 一对多:加入一个外键,参照当前表t_node主键,    而属性parent类型为Node,也就是当前类,则会在同一个表中加入这个字段,参照这个表的主键--> 
      <many-to-one name="parent" column="pid"/> 
  <!--<set>标签是映射一对多的方式,加入一个外键,参照主键。--> 
      <set name="children" lazy="extra"inverse="true"> 
          <key column="pid"/> 
          <one-to-many class="com.wjt276.hibernate.Node"/> 
      </set>      
  </class> 

三、  annotation注解
因为树型节点所有的数据,在数据库中只是存储在一个表中,而对于实体类来说,节点对子节点来说是一对多的关系,而对于父节点来说是多对一的关系。因此可以在一个实体类中注解。如下
[java] 
@Entity 
public class Node { 
    private int id; // 标识符 
    private String name; // 节点名称 
    private int level; // 层次,为了输出设计 
    private boolean leaf; // 是否为叶子节点,这是为了效率设计,可有可无 
    // 父节点:因为多个节点属于一个父节点,因此用hibernate映射关系说是“多对一” 
    private Node parent; 
    // 子节点:因为一个节点有多个子节点,因此用hibernate映射关系说是“一对多” 
    private Set<Node> children = newHashSet<Node>(); 
    @Id 
    @GeneratedValue 
    public int getId() {return id;} 
    @OneToMany(mappedBy="parent") 
    public Set<Node>getChildren() {return children;} 
    @ManyToOne 
    @JoinColumn(name="pid") 
    public Node getParent() {return parent;} 
 } 


四、  测试代码:
[java] 
public class NodeTest extends TestCase { 
  //测试节点的存在 
  public void testSave1(){ 
      NodeManage.getInstanse().createNode("F:\\hibernate\\hibernate_training_tree"); 
  } 
  //测试节点的加载 
  public void testPrintById(){ 
      NodeManage.getInstanse().printNodeById(1); 
  }} 


五、  相应的类代码:
[java] 
public classNodeManage {   
    private static NodeManage nodeManage= newNodeManage(); 
    private NodeManage(){}//因为要使用单例,所以将其构造方法私有化 
    //向外提供一个接口 
    public static NodeManage getInstanse(){ 
        return nodeManage; 
    } 
    /**
     * 创建树
     *@param filePath 需要创建树目录的根目录
     */ 
    public void createNode(String dir) { 
        Session session = null;     
        try { 
            session =HibernateUtils.getSession(); 
            session.beginTransaction(); 
            
            File root = new File(dir); 
            //因为第一个节点无父节点,因为是null 
            this.saveNode(root, session, null,0); 
            
            session.getTransaction().commit(); 
        } catch (HibernateException e) { 
            e.printStackTrace(); 
            session.getTransaction().rollba

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,