- 浏览: 917460 次
- 性别:
- 来自: 黑龙江
文章分类
- 全部博客 (209)
- struts1 (3)
- hibernate3 (19)
- java (13)
- spring2 (5)
- netBeans (1)
- eclipse (1)
- JSF (1)
- DIV+CSS篇章 (1)
- jFreeChart+Oracle之曲线,柱状及饼状图的实现 (1)
- JSF知识与技巧 (3)
- Oracle数据类型的介绍与比较 (2)
- J2EE (2)
- Ajax技术 (4)
- javaScript技术 (25)
- struts2 (16)
- C/C++程序设计 (1)
- oracle系统学习 (29)
- 算法分析 (0)
- Linux实践 (7)
- extjs开发经验 (13)
- flex开发总结 (1)
- FusionCharts总结 (0)
- 高级数据库总结 (0)
- SVG拓扑图开发总结 (0)
- CSS (1)
- CSS使用简介 (1)
- SVG (0)
- DOJO (0)
- Junit测试 (0)
- lucene (24)
- solr (6)
- tokyo tyrant 技术 (7)
- Html5 (1)
- 算法与数据结构 (0)
- 物联网相关技术学习 (0)
- UI设计 (1)
- webservice (0)
- Android (5)
- hibernate4 (3)
- solrcloud (0)
- dorado5 (0)
- dorado7 (0)
- elasticsearch (0)
- GWT (0)
- node.js (0)
- 并发编程 (1)
- 大数据 (1)
- 项目经验 (5)
最新评论
-
cs261244787:
楼主好人! 平安
struts2,hibernate4,spring3配置时问题汇总及解决办法 -
wxluck666:
我也赞一个 很有用
struts2,hibernate4,spring3配置时问题汇总及解决办法 -
wxluck666:
我也赞一个 很有用
struts2,hibernate4,spring3配置时问题汇总及解决办法 -
xinsiyou:
牛逼,就是样式被搞没了
JS实现选项右移,左移,向上,向下调整顺序 -
unnamed__:
这代码风格就像一坨翔
java获取数据库的列名,类型等信息
问题:Hibernate的<many-to-many>双向关联中,一方加载另一方时,怎么样达到按自定义规则排序的目的呢?
实例:角色和菜单是多对多的关系,为角色分配菜单后,加载菜单时,我需要按照菜单的ID来排序显示。
解决办法:
1. 通过在hbm配置文件中配置解决,需要自定义比较器。
1) 在多对多的主控端指定sort属性
这里的主控端为role,受控端为menu。
role的配置为:
menu的配置为:
2) 自定义MenuComparator
<set name="roleMenus" table="ROLE_MENU" inverse="false" lazy="false" sort="menu.MenuComparator">
<key column="RM_ROLE_ROLE_ID" />
<many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" />
</set>
<key column="RM_ROLE_ROLE_ID" />
<many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" />
</set>
menu的配置为:
<set name="roleMenus" table="ROLE_MENU">
<key column="RM_MENU_MENU_ID" />
<many-to-many column="RM_ROLE_ROLE_ID" class="domain.RoleInfoVO" />
</set>
<key column="RM_MENU_MENU_ID" />
<many-to-many column="RM_ROLE_ROLE_ID" class="domain.RoleInfoVO" />
</set>
2) 自定义MenuComparator
这里需要实现Comparator接口,自定义比较器
我在这里是以菜单的ID为排序关键字的,也可通过其他的诸如时间等进行排序,相当灵活,且代码量不大。
/** *//**
* 菜单排序比较器
* MenuComparator
* @author allen
*/
public class MenuComparator implements Comparator {
/** *//**
* 按照菜单的ID进行排序
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object o1, Object o2) {
if(o1 == null){
return (o2 == null) ? 0 : 1;
}
if(o2 == null){
return -1;
}
int cc = 0;
if (o1 instanceof MenuInfoVO && o2 instanceof MenuInfoVO) {
cc = (((MenuInfoVO)o1).getId()).compareTo(((MenuInfoVO)o2).getId());
}
return ((cc < 0) ? -1 : (cc > 0) ? 1 : 0);
}
}
* 菜单排序比较器
* MenuComparator
* @author allen
*/
public class MenuComparator implements Comparator {
/** *//**
* 按照菜单的ID进行排序
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object o1, Object o2) {
if(o1 == null){
return (o2 == null) ? 0 : 1;
}
if(o2 == null){
return -1;
}
int cc = 0;
if (o1 instanceof MenuInfoVO && o2 instanceof MenuInfoVO) {
cc = (((MenuInfoVO)o1).getId()).compareTo(((MenuInfoVO)o2).getId());
}
return ((cc < 0) ? -1 : (cc > 0) ? 1 : 0);
}
}
我在这里是以菜单的ID为排序关键字的,也可通过其他的诸如时间等进行排序,相当灵活,且代码量不大。
2. 使用idbag为关系表增加一个主键。
<idbag>可以理解为人工的id生成器,就好像是实体类一样!集合的每一行都有一个不同的人造关键字。但是,Hibernate没有提供任何机制来让你取得某个特定行的人造关键字。注意
<idbag>
的更新性能要比普通的<bag>
高得多!Hibernate可以有效的定位到不同的行,分别进行更新或删除工作,就如同处理一个list, map或者set一样。<idbag name="roleMenus" table="ROLE_MENU" order-by="RM_MENU_MENU_ID desc">
<meta attribute="field-description">菜单列表</meta>
<collection-id column="id" type="java.lang.Long">
<meta attribute="field-description">主键</meta>
<generator />
</collection-id>
<key column="RM_ROLE_ROLE_ID"/>
<many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" />
</idbag>
<meta attribute="field-description">菜单列表</meta>
<collection-id column="id" type="java.lang.Long">
<meta attribute="field-description">主键</meta>
<generator />
</collection-id>
<key column="RM_ROLE_ROLE_ID"/>
<many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" />
</idbag>
感觉第二个方法是按照我为角色配置菜单的顺序排序的,灵活性比较差,所以个人认为还是第一个方法比较好。
这是网上所提供的解决方案。
Hibernate在处理一对多,多对一双向关联时,用order-by应该就可以解决问题。
在处理多对多时,用最上面的方法,当相等时就可能被覆盖,这时就要有第二次比较。
public class EnterComparator implements Comparator {
public int compare(Object o1, Object o2) {
if (o1 == null) {
return (o2 == null) ? 0 : 1;
}
if (o2 == null) {
return -1;
}
int cc = 0;
if (o1 instanceof Entertainment && o2 instanceof Entertainment) {
cc = (((Entertainment) o1).getPosition())
.compareTo(((Entertainment) o2).getPosition());
if (cc == 0) {
cc = (((Entertainment) o1).getId())
.compareTo(((Entertainment) o2).getId());
}
}
return ((cc < 0) ? 1 : (cc > 0) ? -1 : 0);
}
}
发表评论
-
hibernate-多对多关联关系实例
2012-02-17 18:10 0hibernate-多对多关联关系实例 -
hibernate-多对一关联关系实例
2012-02-17 16:47 0hibernate-多对一关联关系实例 -
hibernate-一对一关联关系实例
2012-02-17 16:35 0hibernate-一对一关联关系实例 -
hibernate-双向一对多关联关系实例
2012-02-17 16:35 1346hibernate-双向一对多关联关系实例 -
hibernate-一对多关联关系实例
2012-02-17 16:34 1393hibernate-一对多关联关系实例 -
hibernate-CRUD基本操作实例
2012-02-17 16:33 1098hibernate-CRUD基本操作实例 -
hibernate-cascade属性介绍
2012-02-17 10:47 25711.none:在保持,更新或删除当前对象时,忽略其他关联的对象 ... -
hibernate主键生成策略介绍
2012-02-17 09:16 1061可选的<generator&g ... -
hibernate一对多实例
2012-02-17 09:04 0hibernate一对多实例 -
EhCache的使用
2008-09-25 11:21 18301.EhCache是什么 EhCache是Hibern ... -
hibernate二级缓存攻略
2008-09-25 11:20 1022很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇 ... -
Java开源项目Hibernate包作用详解
2008-09-25 11:18 1691摘要: Java开源项目Hibern ... -
Hibernate3调用存储过程用法
2008-09-25 11:17 1791DB2中简单存储过程 selectAllUsers CREAT ... -
让Hibernate输出SQL语句以便更加深入调试程序----参数配置
2008-09-25 11:16 3655在J2ee应用中,如果采用Hibernate框架,可以自动建立 ... -
Java数据类型,Hibernate数据类型,标准sql数据类型之间的对应表
2008-09-25 11:15 1568Java数据类型,Hibernate数据类型,标准sql数 ... -
Hibernate性能优化
2008-09-25 11:14 1178有很多人认为Hibernate天生效率比较低,确实,在普遍情况 ... -
Hibernate 参数设置一览表
2008-09-25 11:13 1114属性名 用途 hibernate.diale ... -
Hibernate查询条件封装对象Expression介绍
2008-09-25 11:10 12120Criteria Query是Hibernate提供的将SQL ... -
序列化和反序列化对象到 数据库
2008-09-25 11:09 2089/* * 将对象转化成java.sql.Blob ... -
Hibernate缓存管理
2008-09-25 11:01 9931. Cache简介: 缓存( ...
相关推荐
- Hibernate简化了数据访问层的代码,提供ORM(对象关系映射)解决方案,增强了反射机制,性能优秀,支持多种关系映射。 6. **延迟加载(Lazy Loading)**: - Hibernate通过延迟加载策略,只在实际访问数据时才...
Hibernate是一款开源的Object-Relational Mapping(ORM)框架,它为Java开发者提供了强大的数据持久化解决方案,将复杂的数据库操作转化为对Java对象的操作,简化了数据库应用的开发。Hibernate通过映射XML文件或...
Hibernate 3.2框架是Java...总的来说,Hibernate 3.2框架为Java开发者提供了一个强大的ORM解决方案,简化了数据库操作,提升了开发效率。通过深入理解和熟练应用,开发者可以构建出更加健壮、高效的数据库驱动应用。
综上所述,Hibernate API 3.5.5GA版本是一个功能强大且成熟的ORM解决方案,它的API设计充分考虑了开发者的便利性和系统的稳定性。通过深入理解和熟练掌握这个版本的API,开发者可以更高效地进行数据库操作,提升项目...
Hibernate作为Java领域中广泛使用的ORM解决方案,它极大地简化了数据库操作,将复杂的SQL语句与Java代码解耦,提高了开发效率和代码可维护性。 这篇学习笔记涵盖了以下核心知识点: 1. **Hibernate概述**:介绍...
### Hibernate核心知识点解析 ...综上所述,Hibernate不仅是一种强大的ORM工具,还是一个完整的持久层解决方案。通过掌握其核心概念和使用技巧,开发者可以极大地提高开发效率并简化复杂的数据库操作。
Spring可以与Struts和Hibernate集成,形成更强大的MVC解决方案。 综上所述,理解和熟练掌握Struts、Spring和Hibernate的原理、工作流程及优化策略,对于Java Web开发者来说是至关重要的,这能帮助他们构建高效、可...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中...
12、写Hibernate的一对多和多对一双向关联的orm配置? 134 9、hibernate的inverse属性的作用? 134 13、在DAO中如何体现DAO设计模式? 134 14、spring+Hibernate中委托方案怎么配置? 134 15、spring+Hibernate中委托...
hibernate持久化托管bean可否用bean与数据库相同的主键object关联 可以,通过设置主键映射实现。 #### 39. 如何在hibernate中调用原始sql 使用 `Session` 的 `createSQLQuery()` 方法。 #### 40. 分别描述JDBC...
- **大数据量访问解决方案**:缓存策略、分库分表、读写分离等。 - **遇到的问题及解决办法**:技术难题、团队合作、时间管理等方面。 - **项目收获**:个人成长、团队协作经验等。 - **构建工具与模块划分**:构建...