zoukankan      html  css  js  c++  java
  • Hibernate 树状映射

    示例:

    类Org表示组织机构,是一个典型的树状结构数据,其属性包括:

    id,name,children,parent

    要将Org映射到数据库中,对parent作多对一的映射,对children作一对多的映射。

    我们可以通过三张表来解释其关系

    1

    代码实现:

    1.建Org实体类

    @Entity
    public class Org {
    	private int id;
    	private String name;
    	private Set<Org> childen = new HashSet<Org>();
    	private Org parent;
    	@Id
    	@GeneratedValue
    	public int getId() {
    		return id;
    	}
    	public void setId(int 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> getChilden() {
    		return childen;
    	}
    	public void setChilden(Set<Org> childen) {
    		this.childen = childen;
    	}
    	@ManyToOne
    	public Org getParent() {
    		return parent;
    	}
    	public void setParent(Org parent) {
    		this.parent = parent;
    	}
    }

    2.建Junit测试类

    @Test
    public void testDelete() {
    	new SchemaExport(new Configuration().configure()).create(true, true);
    			
    }

    运行程序,在数据库中自动生成表org,有3个属性:id,name,parent_id(外键)

    3.存储数据

    @Test
    public void testSave() {
    		
    	Session session = sf.getCurrentSession();
    	session.beginTransaction();
    		
    	Org o = new Org();
    	o.setName("总公司");
    		
    	Org o1 = new Org();
    	o1.setName("分公司1");
    		
    	Org o2 = new Org();
    	o2.setName("分公司2");
    		
    	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.getChilden().add(o1);
    	o.getChilden().add(o2);
    	o1.getChilden().add(o11);
    	o1.getChilden().add(o12);
    	o2.getChilden().add(o21);
    		
    		
    	o11.setParent(o1);
    	o12.setParent(o1);
    	o21.setParent(o2);
    	o1.setParent(o);
    	o2.setParent(o);
    		
    	session.save(o);
    
    	session.getTransaction().commit();		
    }

    4.打印输出

    @Test
    public void testLoad() {
    	
    	Session session = sf.getCurrentSession();
    	session.beginTransaction();
    	
    	Org o = (Org) session.load(Org.class, 1);
    	print(o,0);
    
    	session.getTransaction().commit();		
    }
    
    //通过递归方式,以树状结构,打印输出各对象的名字
    private void print(Org o,int level) {
    	for(int i=0;i<level;i++){
    		System.out.print("----");
    	}
    	System.out.println(o.getName());
    	for(Org child : o.getChilden()){
    		print(child,level+1);
    	}
    }
    输出结果
    总公司
    ----分公司1
    --------分公司1_部门2
    --------分公司1_部门1
    ----分公司2
    --------分公司2_部门1
     
  • 相关阅读:
    mysql表单输入数据出现中文乱码解决方法
    swift实现水仙花数
    Mac终端使用swift REPL异常处理方法
    灰度发布、金丝雀发布,持续集成
    CentOS7.2配置本地yum源
    SNMP 相关检测分支
    Flask 中 @property 和@password.setter 的运用
    Python 数据结构--字典
    Python 数据结构--序列
    网络编程
  • 原文地址:https://www.cnblogs.com/weilunhui/p/3905765.html
Copyright © 2011-2022 走看看