Hibernate多对一自身关联

说明:一个部门有若干个子部门,子部门还可以有子部门,本文通过这个演示myeclipse如何实现这种树形关系的持久化。 

开发工具:myeclipse 7.0 GA 
数 据 库:mysql-5.0.41 
操作系统:windows xp professional 中文版 

步骤: 
1、建立mysql5数据库testdb,脚本下面已经给出。 
2、配置myeclipse的数据库服务器,并建立名称为mysql的数据库链接。 
3、建议myeclipse的web工程,名称为hibernateRel,并加入hibernate支持。 
4、在myeclipse的数据库视图中链接数据库并通过表生成实体POJO和配置文件,中间不生成DAO。 
5、检查配置文件的正确性,然后测试类进行测试。 


一、建立数据库的脚本: 

drop table if exists part; 

-- alter table part drop foreign key fk_part; 

create table part( 
id bigint not null primary key, 
name varchar(20), 
father_id bigint 
); 

alter table part add index fk_part (father_id), 
add constraint fk_part foreign key (father_id) references part(id); 

表关系的逻辑图: 
Java代码   收藏代码
  1. +-----------+  
  2. | Part      |  
  3. +-----------+  
  4. | id        |<---------|<PK>  
  5. | name      |          |  
  6. | father_id |----------|<FK>  
  7. +-----------+  


特别注意:因为有外键约束,需要事务支持,在安装数据库的时候,需要配置mysql数据库服务器的参数。数据库的引擎应该用InnoDB,关闭了自动提交模式,也就是SET AUTOCOMMIT=0。 
  
二、通过myeclipse生成实体和配置文件: 

Part.java 

Java代码   收藏代码
  1. public class Part implements java.io.Serializable {  
  2.    
  3.     // Fields  
  4.    
  5.     private Long id;  
  6.     private String name;  
  7.     private Part part;  //父Part  
  8.     private Set parts = new HashSet(0); //子Part  
  9.    
  10.     // Constructors  
  11.    
  12.     /** default constructor */  
  13.     public Part() {  
  14.     }  
  15.    
  16.     /** minimal constructor */  
  17.     public Part(Long id) {  
  18.         this.id = id;  
  19.     }  
  20.    
  21.     public Part(String name) {  
  22.         this.name = name;  
  23.     }     
  24.       
  25.     /** full constructor */  
  26.     public Part(Long id, Part part, String name, Set parts) {  
  27.         this.id = id;  
  28.         this.part = part;  
  29.         this.name = name;  
  30.         this.parts = parts;  
  31.     }  
  32.    
  33.     // Property accessors  
  34.    
  35.     public Long getId() {  
  36.         return this.id;  
  37.     }  
  38.    
  39.     public void setId(Long id) {  
  40.         this.id = id;  
  41.     }  
  42.    
  43.     public Part getPart() {  
  44.         return this.part;  
  45.     }  
  46.    
  47.     public void setPart(Part part) {  
  48.         this.part = part;  
  49.     }  
  50.    
  51.     public String getName() {  
  52.         return this.name;  
  53.     }  
  54.    
  55.     public void setName(String name) {  
  56.         this.name = name;  
  57.     }  
  58.    
  59.     public Set getParts() {  
  60.         return this.parts;  
  61.     }  
  62.    
  63.     public void setParts(Set parts) {  
  64.         this.parts = parts;  
  65.     }  
  66.    
  67. }  


Part.hbm.xml 

Java代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "[url]http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd[/url]">  
  4. <!--   
  5.     Mapping file autogenerated by MyEclipse Persistence Tools  
  6. -->  
  7. <hibernate-mapping>  
  8.     <class name="org.lavasoft.Part" table="part">  
  9.         <id name="id" type="java.lang.Long">  
  10.             <column name="id" />  
  11.             <generator class="increment" />  
  12.         </id>  
  13.         <property name="name" type="java.lang.String">  
  14.             <column name="name" length="20" />  
  15.         </property>  
  16.         <many-to-one name="part" class="org.lavasoft.Part" fetch="select">  
  17.             <column name="father_id" />  
  18.         </many-to-one>  
  19.         <set name="parts" cascade="save-update" inverse="true">  
  20.             <key>  
  21.                 <column name="father_id" />  
  22.             </key>  
  23.             <one-to-many class="org.lavasoft.Part" />  
  24.         </set>  
  25.     </class>  
  26. </hibernate-mapping>  



三、写测试类进行测试: 
Test.java 

Java代码   收藏代码
  1. package org.lavasoft;  
  2.    
  3. import org.hibernate.HibernateException;  
  4. import org.hibernate.Session;  
  5. import org.hibernate.Transaction;  
  6.    
  7. public class Test {  
  8.    
  9.     /** 
  10.      * @param args 
  11.      */  
  12.     public static void main(String[] args) {  
  13.         // TODO Auto-generated method stub  
  14.           
  15.         Part p1=new Part("p1");  
  16.         Part p11=new Part("p11");  
  17.         Part p12=new Part("p12");  
  18.       
  19.         p1.getParts().add(p11);  
  20.         p1.getParts().add(p12);  
  21.         p11.setPart(p1);  
  22.         p12.setPart(p1);  
  23.           
  24.         Configuration config = new Configuration().configure();  
  25.         SessionFactory factory = config.buildSessionFactory();  
  26.         Session session = factory.openSession();  
  27.         Transaction tx = session.beginTransaction();  
  28.   
  29.         try{  
  30.             session.save(p1);  
  31.             tx.commit();  
  32.         }catch(HibernateException e){  
  33.             e.printStackTrace();  
  34.             tx.rollback();  
  35.         }finally{  
  36.             session.close();  
  37.         }    
  38.     }  
  39. }  


四、运行测试类Test,控制台打印信息: 
------------------------------------------ 
Hibernate: select max(id) from part 
Hibernate: insert into part (name, father_id, id) values (?, ?, ?) 
Hibernate: insert into part (name, father_id, id) values (?, ?, ?) 
Hibernate: insert into part (name, father_id, id) values (?, ?, ?) 


查看数据库: 

Java代码   收藏代码
  1. D:\mysql-5.0.41-win32\bin>mysql -uroot -123456  
  2. Welcome to the MySQL monitor.  Commands end with ; or \g.  
  3. Your MySQL connection id is 13  
  4. Server version: 5.0.41-community MySQL Community Edition (GPL)  
  5.    
  6. Type 'help;' or '\h' for help. Type '\c' to clear the buffer.  
  7.    
  8. mysql> use testdb;  
  9. Database changed  
  10.    
  11. mysql> describe part;  
  12. +-----------+-------------+------+-----+---------+-------+  
  13. | Field     | Type        | Null | Key | Default | Extra |  
  14. +-----------+-------------+------+-----+---------+-------+  
  15. | id        | bigint(20)  | NO   | PRI |         |       |  
  16. | name      | varchar(20) | YES  |     | NULL    |       |  
  17. | father_id | bigint(20)  | YES  | MUL | NULL    |       |  
  18. +-----------+-------------+------+-----+---------+-------+  
  19. 3 rows in set (0.00 sec)  
  20.    
  21. mysql> select * from part;  
  22. +----+------+-----------+  
  23. | id | name | father_id |  
  24. +----+------+-----------+  
  25. |  1 | p1   |      NULL |  
  26. |  2 | p12  |         1 |  
  27. |  3 | p11  |         1 |  
  28. +----+------+-----------+  
  29. 3 rows in set (0.00 sec)  
  30.    
  31. mysql>  


测试结果表明,保存父机关的时候,可以级联保存父机关下的子机关。 

总结:这个表建立好后,由myeclipse生成的POJO不需要做任何改动,生成的mapping也需要添加一个cascade="save-update"。然后就直接写测试类进行测试。 

本文出自 “熔 岩” 博客,转载请与作者联系!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值