hibernate实现Tree
来源:互联网 发布:逆波兰式算法 编辑:程序博客网 时间:2024/06/18 08:07
Tree是一种比较常见的数据展示类型,本文简单探讨一下hibernate实现创建Tree的过程。
首先简介一下Tree,每一个节点需要有一个对父节点id的引用,即Tree实体类中需要有对父节点的引用,使用Many2One,当然,关联是双向的,同时,还要有对子节点的引用,使用One2Many,因为关联是双向的,所以会使用到mappedBy
1.本例使用树实体类使用Org,除声明id和name属性外,还需要引用父节点Org parent,并在getParent上使用ManyToOne
同时需要引用子节点的集合Set<Org> children,并在getChildren上使用@OneToMany(mappedBy="parent")
Org
package com.baosight.model;import java.util.*;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.OneToMany;@Entitypublic class Org {private String id;private String name;private Set<Org> children = new HashSet<Org>();private Org parent;@Id@GeneratedValue//autopublic String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@OneToMany(mappedBy="parent",cascade=CascadeType.ALL,fetch=FetchType.EAGER)public Set<Org> getChildren() {return children;}public void setChildren(Set<Org> children) {this.children = children;}@ManyToOne@JoinColumn(name="parent_id")public Org getParent() {return parent;}public void setParent(Org parent) {this.parent = parent;}}
hibernate的配置文件hibernate.cfg.xml
<?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"><hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property> <property name="connection.username">scott</property> <property name="connection.password">tiger</property> <!-- JDBC connection pool (use the built-in) --> <!-- <property name="connection.pool_size">1</property> --> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.Oracle9iDialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property><!-- <property name="format_sql">true</property> --> <!-- Drop and re-create the database schema on startup --> <!-- <property name="hbm2ddl.auto">update</property> --><mapping class="com.baosight.model.Org"/> </session-factory></hibernate-configuration>
JUnit测试类
package com.baosight.model;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.AnnotationConfiguration;import org.hibernate.cfg.Configuration;import org.hibernate.tool.hbm2ddl.SchemaExport;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;public class OrMappingTest {private static SessionFactory sf = null;@BeforeClasspublic static void beforeClass(){new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);// 读取配置文件Configuration cfg = new AnnotationConfiguration();// 得到session工厂sf = cfg.configure().buildSessionFactory();}@Testpublic void testSave() {Org o = new Org();o.setName("总公司");Org o1 = new Org();o1.setName("分公司1");Org o2 = new Org();o2.setName("分公司2");Org o3 = new Org();o3.setName("分公司3");Org o11 = new Org();o11.setName("分公司1部门1");Org o12 = new Org();o12.setName("分公司1部门2");Org o21 = new Org();o21.setName("分公司2部门1");o.getChildren().add(o1);o.getChildren().add(o2);o.getChildren().add(o3);o1.getChildren().add(o11);o1.getChildren().add(o12);o2.getChildren().add(o21);o1.setParent(o);o2.setParent(o);o3.setParent(o);o11.setParent(o1);o12.setParent(o1);o21.setParent(o2);Session session = sf.getCurrentSession();session.beginTransaction();session.save(o);session.getTransaction().commit();}@Testpublic void testLoad() {testSave();Session s = sf.getCurrentSession();s.beginTransaction();Org o = (Org) s.load(Org.class, "1");//输出Treeprint(o,0);s.getTransaction().commit();}private void print(Org o, int level) {// TODO Auto-generated method stubString preStr = "";for(int i=0;i<level;i++){preStr +="----";}System.out.println(preStr+o.getName());for(Org org:o.getChildren()){print(org,level+1);}}/*@Testpublic void testSchemaExport() {}*/@AfterClasspublic static void afterClass(){// 关闭session工厂sf.close();}}2.使用testSave进行测试,要想在保存父节点的同时保存子节点,需要设置@OneToMany的cascade=CascadeType.ALL,并且,设置父节点和子节点之间的双向引用关系
测试结果
3.使用testLoad打印Tree
3.1不使用fetch时的结果
3.2在@OneToMany使用fetch=FetchType.EAGER时的结果为
以上即为hibernate对于Tree的简单实现,在具体使用到Tree时,还需要做相关的调整,需要仔细体会。
1 0
- hibernate实现Tree
- Hibernate annotation tree
- hibernate tree annotation
- 11级_Java_曹建波 04.07 jQuery easyUI tree +struts2+hibernate +mysql 实现 三级联动的案例
- jQuery easyUI tree +struts2+hibernate +mysql 实现 三级联动的案例
- 使用Hibernate构造出一棵Tree
- Hibernate:模拟Hibernate实现
- Tree的简单实现
- FLEX TREE实现
- flex 实现Tree
- AVL Tree 的实现
- B- Tree 的实现
- B+tree 实现
- B-tree(C++实现)
- Binary Search Tree 实现
- java实现tree功能
- 哈夫曼树(Huffman Tree) 实现
- Decision Tree 及实现
- Struts学习总结
- LoaderManager使用详解(二)---了解LoaderManager
- Android 主题和样式
- 01-从SAPI接口开始
- 文章标题
- hibernate实现Tree
- csuoj-1727-The Fake Coin
- CString由Unicode转为utf8格式
- linux 下 lamp 编译安装 20160424 szx
- 02-一次请求的开始与结束
- layoutSubview的方法总结
- IE插件开发注意事项
- javascript高级程序设计(4-5)章笔记
- 03-一次请求生命周期