hibernate 通过annotaion 内联的 一对多关系 取出树形的导航

来源:互联网 发布:数控火焰切割手工编程 编辑:程序博客网 时间:2024/06/11 16:49
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. CREATE TABLE `nav` (  
  2.   `id` int(200) NOT NULL AUTO_INCREMENT COMMENT 'id',  
  3.   `name` varchar(200) DEFAULT NULL COMMENT '类别名称',  
  4.   `namepy` varchar(200) DEFAULT NULL COMMENT '拼音',  
  5.   `sl` int(200) DEFAULT NULL COMMENT '每个类别下的数量',  
  6.   `flag` int(10) DEFAULT NULL COMMENT '用来判断它下面是否有list',  
  7.   `parent_id` int(200) DEFAULT NULL COMMENT '父id',  
  8.   `order_id` int(10) DEFAULT NULL COMMENT '排序',  
  9.   `level` int(10) DEFAULT NULL COMMENT '级别',  
  10.   PRIMARY KEY (`id`)  
  11. ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;  
  12.   
  13. /*Data for the table `nav` */  
  14.   
  15. LOCK TABLES `nav` WRITE;  
  16.   
  17. insert  into `nav`(`id`,`name`,`namepy`,`sl`,`flag`,`parent_id`,`order_id`,`level`) values (1,'root','root',8,0,0,0,0),(2,'实验室概况','shiyanshijianjie',5,0,1,2,1),(3,'实验室简介','shiyanshijianjie',0,0,2,1,2),(4,'学术委员会','xueshuweiyuanhui',0,0,2,2,2),(5,'组织结构','zuzhijiegou',0,0,2,3,2),(6,'仪器设备','yiqishebei',0,1,2,4,2),(7,'规章制度','guizhangzhidu',0,1,2,5,2),(8,'新闻资讯','xinwenzhongxin',2,0,1,3,1),(9,'新闻中心 ','xinwenzhongxin',0,1,8,1,2),(10,'通知公告','tongzhitonggao',0,1,8,2,2),(11,'科学研究','yanjiufangxiang',5,0,1,4,1),(12,'研究方向','yanjiufangxiang',0,0,11,1,2),(13,'研究队伍','yanjiuduiwu',0,0,11,2,2),(14,'科研项目','keyanxiangmu',0,1,11,3,2),(15,'科研成果','keyanchengguo',0,1,11,4,2),(16,'技术服务','jishufuwu',0,0,11,5,2),(17,'合作交流','guojihezuo',3,0,1,5,1),(18,'国际合作 ','guojihezuo',0,1,17,1,2),(19,'学术会议','xueshuhuiyi',0,1,17,2,2),(20,'国际合作 ','guojihezuo',0,0,17,3,2),(21,'人才培养','yanjiushengxinxi',4,0,1,6,1),(22,'研究生信息','yanjiushengxinxi',0,1,21,1,2),(23,'校内导师','xiaoneidaoshi',0,0,21,2,2),(24,'校外导师','xiaowaidaoshi',0,0,21,3,2),(25,'产学研基地','chanxueyanjidi',0,0,21,4,2),(26,'下载中心','wenjianguizhang',4,0,1,7,1),(27,'文件/规章','wenjianguizhang',0,0,26,1,2),(28,'学术报告','xueshubaogao',0,0,26,2,2),(29,'表格','biaoge',0,0,26,3,2),(30,'其它','qita',0,0,26,4,2),(31,'首页','main',0,0,1,1,1);  

实体:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Entity    
  2. @Table(name = "nav")     
  3. public class Nav implements Serializable {     
  4.     private static final long serialVersionUID = 1L;     
  5.     @Id    
  6.     @Basic(optional = false)     
  7.     @GeneratedValue(strategy = GenerationType.IDENTITY)     
  8.     @Column(name = "id", nullable = false)     
  9.     private Integer id;     
  10.     @Column(name = "name")     
  11.     private String lbmc;//类别名称     
  12.     @Column(name = "namepy")     
  13.     private String lbmcPy;//类别名称     
  14.     @Column(name = "sl")     
  15.     private int sl;//数量  
  16.     @Column(name = "flag")     
  17.     private int flag;//标识判断是否有子list  
  18.       
  19.     @Column(name = "order_id")     
  20.     private int order_id;//级别排序  
  21.     @Column(name = "level")     
  22.     private int level;//级别  
  23.      
  24.       
  25.       
  26.       
  27.     @ManyToOne(cascade={CascadeType.ALL},fetch = FetchType.LAZY)  //多对一的关联FetchType.LAZY(懒加载)a) 只有真正获取数据时才发出SQL语句  
  28.     /**(定义列名) @JoinColumn与@Column相区别的是:@JoinColumn注释的是保存表与表之间关系的字段,它要标注在实体属性上。而 @Column标注的是表中不包含表关系的字段。*/  
  29.     @JoinColumn(name="parent_id")//这是自关联的pid列名设置  
  30.   //多对一,@JoinColumn与@column类似,指定映射的数据库字段  
  31.      private Nav parent;//父id  
  32.       
  33.     @OneToMany(targetEntity = Nav.class,cascade={CascadeType.ALL}, mappedBy="parent",fetch = FetchType.EAGER)//一对多,mappedBy="parent"表示由parent主导(即在parent端有值)  
  34.     @OrderBy("order_id"//List的映射可以进行排序,对order_id进行排序  
  35.     private List<Nav> childrens=new ArrayList<Nav>();  
  36.   
  37.       
  38.     
  39. }    


dao:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Override  
  2. public List<Nav> queryAllNav(int id) {  
  3.     String hql="from Nav nav where nav.parent.id=:id order by order_id";  
  4.     Query q1=getCurrentSession().createQuery(hql).setInteger("id", id);  
  5.     List<Nav> list=q1.list();  
  6.     return list;  
  7. }  


测试:  采用的是集成测试


[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration(locations = {"classpath:applicationContext.xml"})  
  3. @Transactional  
  4. @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)  
  5. public class Spring_integration_testing {  
  6.   
  7.      @Resource  
  8.         private ApplicationContext ctx;    
  9.         @Resource  
  10.         @Qualifier("ArticleServiceImpl")  
  11.         private ArticleService adService;  
  12.       @Test  
  13.             public void testSave3() throws Exception{  
  14.             List<Nav> allNavs=adService.queryAllNav(1);//查询出一级导航的  
  15.             for(Nav nav:allNavs){  
  16.                 System.out.println("-----------------------");  
  17.                 System.out.println(nav.getLbmc());  
  18.                 System.out.println(nav.getChildrens().size());  
  19.                 System.out.println(nav.getParent().getLbmc());  
  20.                 for(Nav nav3:nav.getChildrens()){  
  21.                     System.out.println("===================");  
  22.                     System.out.println(nav3.getLbmc());  
  23.                     System.out.println(nav3.getChildrens().size());  
  24.                     System.out.println(nav3.getParent().getLbmc());  
  25.                     System.out.println("===================");  
  26.                 }  
  27.                 System.out.println("-----------------------");  
  28.             }  
  29.   
  30.             }  
  31. }  


运行结果:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. root  
  2. -----------------------  
  3. -----------------------  
  4. 实验室概况  
  5. 5  
  6. root  
  7. ===================  
  8. 实验室简介  
  9. 0  
  10. 实验室概况  
  11. ===================  
  12. ===================  
  13. 学术委员会  
  14. 0  
  15. 实验室概况  
  16. ===================  
  17. ===================  
  18. 组织结构  
  19. 0  
  20. 实验室概况  
  21. ===================  
  22. ===================  
  23. 仪器设备  
  24. 0  
  25. 实验室概况  
  26. ===================  
  27. ===================  
  28. 规章制度  
  29. 0  
  30. 实验室概况  
  31. ===================  
  32. -----------------------  
  33. -----------------------  
  34. 新闻资讯  
  35. 2  
  36. root  
  37. ===================  
  38. 新闻中心   
  39. 0  
  40. 新闻资讯  
  41. ===================  
  42. ===================  
  43. 通知公告  
  44. 0  
  45. 新闻资讯  
  46. ===================  
  47. -----------------------  
  48. -----------------------  
  49. 科学研究  
  50. 5  
  51. root  
  52. ===================  
  53. 研究方向  
  54. 0  
  55. 科学研究  
  56. ===================  
  57. ===================  
  58. 研究队伍  
  59. 0  
  60. 科学研究  
  61. ===================  
  62. ===================  
  63. 科研项目  
  64. 0  
  65. 科学研究  
  66. ===================  
  67. ===================  
  68. 科研成果  
  69. 0  
  70. 科学研究  
  71. ===================  
  72. ===================  
  73. 技术服务  
  74. 0  
  75. 科学研究  
  76. ===================  
  77. -----------------------  
  78. -----------------------  
  79. 合作交流  
  80. 3  
  81. root  
  82. ===================  
  83. 国际合作   
  84. 0  
  85. 合作交流  
  86. ===================  
  87. ===================  
  88. 学术会议  
  89. 0  
  90. 合作交流  
  91. ===================  
  92. ===================  
  93. 国际合作   
  94. 0  
  95. 合作交流  
  96. ===================  
  97. -----------------------  
  98. -----------------------  
  99. 人才培养  
  100. 4  
  101. root  
  102. ===================  
  103. 研究生信息  
  104. 0  
  105. 人才培养  
  106. ===================  
  107. ===================  
  108. 校内导师  
  109. 0  
  110. 人才培养  
  111. ===================  
  112. ===================  
  113. 校外导师  
  114. 0  
  115. 人才培养  
  116. ===================  
  117. ===================  
  118. 产学研基地  
  119. 0  
  120. 人才培养  
  121. ===================  
  122. -----------------------  
  123. -----------------------  
  124. 下载中心  
  125. 4  
  126. root  
  127. ===================  
  128. 文件/规章  
  129. 0  
  130. 下载中心  
  131. ===================  
  132. ===================  
  133. 学术报告  
  134. 0  
  135. 下载中心  
  136. ===================  
  137. ===================  
  138. 表格  
  139. 0  
  140. 下载中心  
  141. ===================  
  142. ===================  
  143. 其它  
  144. 0  
  145. 下载中心  
  146. ===================  
  147. -----------------------  

然后简单的介绍几个 Hibernate Annotation关系映射, 级联cascade属性

级联(cascade)属性
1、CascadeType.ALL(包括增、删、改、查,联动操作),其实查不算在内,查Fetch

2、CascadeType.MERGE(合并的join)--不重要

3、CascadeType.PERSIST(保存的时候在级联)

4、CascadeType.REFRESH(刷新说明:比如现在我查询出了数据,另外一个人在我查询数据之后,他对数据做了修改,这是才会级联上,hibernate会自动刷新我查询出来的数据)

5、CascadeType.REMOVE (只要在删除操作时才会级联)

6、我们一般都只设置CascadeType.ALL就OK了,

7、Cascade不是必须的,他的作用只是可以让我们快速的开发,我们也可以通过手动增、删、改、查

Fetch捉取策略
1、FetchType.EAGER(渴望的,希望马上得到)

a) 一对多关系,比如通过get()方法来get出一的一端,他之后会出一条SQL语句,不会自动去查询多的一端,如果设置FetchType.EAGER,会讲他的关联对象查询出来

b) 如果是load的话,他不会发出SQL语句,因为load支持延迟加载,只有真正获取数据时才会发SQL

2、FetchType.LAZY(懒加载)

a) 只有真正获取数据时才发出SQL语句

3、默认是:FetchType.LAZY(一对多)

4、默认是:FetchType.EAGER(多对一)

5、一般使用默认就可以了


0 0
原创粉丝点击