码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate中,基于Annotation的简单树形结构的实现

时间:2016-09-24 23:27:47      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:

在系统设计中,经常用到递归性质的树形结果,比如菜单、多级分类等,一般是在同一个表中定义父子关系实现这种结构。

下面是在Hibernate中,基于Annotation的简单树形结构的实现:

第一步:创建Entity类,并添加注解实现关联关系

    ps: 主要是利用@ManyToOne 和 @OneToMany 配置在同一个Entity类中实现树形递归的结构。hibernate注解形式比在xml配置更加简洁

TreeNode.java

 1 package com.hfut.hibernate;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import javax.persistence.CascadeType;
 7 import javax.persistence.Entity;
 8 import javax.persistence.FetchType;
 9 import javax.persistence.GeneratedValue;
10 import javax.persistence.Id;
11 import javax.persistence.JoinColumn;
12 import javax.persistence.ManyToOne;
13 import javax.persistence.OneToMany;
14 
15 @Entity
16 public class Node {    
17     private int id;
18     private String name;
19     private Node parent;
20     private Set<Node> children = new HashSet<Node>();
21 
22     @Id
23     @GeneratedValue
24     public int getId() {
25         return id;
26     }
27     public void setId(int id) {
28         this.id = id;
29     }
30     public String getName() {
31         return name;
32     }
33     public void setName(String name) {
34         this.name = name;
35     }
36     @ManyToOne(cascade=CascadeType.ALL)
37     @JoinColumn(name="nodeId")
38     public Node getParent() {
39         return parent;
40     }
41     public void setParent(Node parent) {
42         this.parent = parent;
43     }
44     @OneToMany(mappedBy="parent", cascade=CascadeType.ALL,fetch=FetchType.EAGER)
45     public Set<Node> getChildren() {
46         return children;
47     }
48     public void setChildren(Set<Node> children) {
49         this.children = children;
50     }
51 }

第二步:创建hibernate默认配置文件:

hibernate.cfg.xml

 1 <?xml version=‘1.0‘ encoding=‘utf-8‘?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 5 
 6 <hibernate-configuration>
 7 
 8     <session-factory>
 9 
10          
11         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
12         <property name="connection.url">jdbc:mysql://localhost/testone</property>
13         <property name="connection.username">root</property>
14         <property name="connection.password">123456</property>
15         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
16        <!--
17         <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
18         <property name="connection.url">jdbc:oracle:thin:@localhost:1521:SXT</property>
19         <property name="connection.username">scott</property>
20         <property name="connection.password">tiger</property>
21           <property name="dialect">org.hibernate.dialect.OracleDialect</property>
22        -->
23 
24         <!-- JDBC connection pool (use the built-in) -->
25         <property name="connection.pool_size">1</property>
26 
27         
28 
29         <!-- Enable Hibernate‘s automatic session context management -->
30         <property name="current_session_context_class">thread</property>
31 
32         <!-- Disable the second-level cache  -->
33         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
34 
35         <!-- Echo all executed SQL to stdout -->
36         <property name="show_sql">true</property>
37         <property name="format_sql">true</property>
38 
39         <!-- Drop and re-create the database schema on startup
40         <property name="hbm2ddl.auto">update</property>
41          -->
42     <mapping class="com.hfut.hibernate.Node"/>
43 
44     </session-factory>
45 
46 </hibernate-configuration>

第三步:创建测试文件:

TreeNodeTest.java

 1 package com.hfut.hibernate;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.cfg.AnnotationConfiguration;
 6 import org.hibernate.tool.hbm2ddl.SchemaExport;
 7 import org.junit.AfterClass;
 8 import org.junit.BeforeClass;
 9 import org.junit.Test;
10 
11 import com.hfut.hibernate.TreeNode;
12 
13 public class TreeNodeTest {
14     
15     private static SessionFactory sessionFactory;
16     
17     @BeforeClass
18     public static void beforeClass() {
19         new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
20         sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
21     }
22     
23     @AfterClass
24     public static void afterClass() {
25         sessionFactory.close();
26     }
27 
28     public void testSave() {
29         Session session = sessionFactory.openSession();
30         TreeNode node0 = new TreeNode();
31         node0.setName("父亲");
32         TreeNode node1 = new TreeNode();
33         node1.setName("大儿子");
34         TreeNode node2 = new TreeNode();
35         node2.setName("小儿子");
36         TreeNode node3 = new TreeNode();
37         node3.setName("大儿子的大儿子");
38         TreeNode node4 = new TreeNode();
39         node4.setName("大儿子的小儿子");
40         TreeNode node5 = new TreeNode();
41         node5.setName("小儿子的大儿子");
42         TreeNode node6 = new TreeNode();
43         node6.setName("小儿子的小儿子");
44         
45         node0.getChildren().add(node1);
46         node0.getChildren().add(node2);
47         node1.getChildren().add(node3);
48         node1.getChildren().add(node4);
49         node1.setParent(node0);
50         node2.getChildren().add(node5);
51         node2.getChildren().add(node6);
52         node2.setParent(node0);
53         node3.setParent(node1);
54         node4.setParent(node1);
55         node5.setParent(node2);
56         node6.setParent(node2);
57         
58         session.beginTransaction();
59         session.save(node0);
60         session.getTransaction().commit();
61         session.close();
62     }
63     @Test
64     public void testLoad() {
65         testSave();
66         Session session = sessionFactory.openSession();
67         session.beginTransaction();
68         TreeNode node = (TreeNode)session.load(TreeNode.class, 1);
69         print(node,0);
70         session.getTransaction().commit();
71         session.close();
72     }
73 
74     private void print(TreeNode node,int level) {
75         String preStr = "";
76         for(int i=0;i<level;i++){
77             preStr +="----";
78         }
79         System.out.println(preStr+node.getName());
80         for(TreeNode children:node.getChildren()){
81             print(children,level+1);
82         }    
83     }
84 }

 

[四]、测试结果

测试结果如下:

父亲
----小儿子
--------小儿子的大儿子
--------小儿子的小儿子
----大儿子
--------大儿子的小儿子
--------大儿子的大儿子

 

Hibernate中,基于Annotation的简单树形结构的实现

标签:

原文地址:http://www.cnblogs.com/mei2016/p/5904313.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!