`
ximenpiaohua
  • 浏览: 840 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

hibernate中的关系处理心得交流

阅读更多
以前使用hibernate的时候关系都是根据业务来处理的,也就是对象间的关系没有设置,仅仅设置一个ID外键来做关联,感觉对象的管理蛮方便的,研究了领域驱动设计很长时间了。最近一个项目使用了hibernate的关系,但是怎么处理起来都觉得别扭,举个例子:
用户和用户组以及角色三个实体:即:User,UserGroup,Role他们的关系为User和UserGroup为many-to-many,UserGroup和Role为many-to-many,关系都为双向的。
开始的整体结构为:
dao层:封装简单的dao的操作,没有处理关联关系
service层:处理业务逻辑,涉及到关系的处理,调用dao层
别扭得地方:
1.如果在UserGroup对User上设置了级联插入关系:
那么当插入UserGroup的时候,UserGroup中的User集合也会插入,但是这个时候如果有业务上的要求,用户名必须唯一,级联插入的时候抛异常,的确这个情况我们还是可以处理的,但是必须知道会抛什么异常,然后catch住了之后,抛出自己的业务异常,感觉处理起来不是很流畅,如果在User设置对UserGroup级联插入,情况可能更复杂,比如UserGroup对Role也设置了级联插入。不知道这种情况大家如何处理。
2.如果所用的级联关系都没有设置,全部由业务来决定
a.如果用户在前台在保存User时,设置了User中的UserGroup集合,但是UserGroup集合并没有在库中,那么我们要先保存UserGroup集合到数据库中,同时UserGroup又包含Role的集合,也是先保存到数据库中,因为是EJB项目涉及到远程调用,确保一次调用能做更多的操作。
    这样的话,会发现UserService会有很多代码会和UserGroupService相同,因为保存User的时候涉及到UserGroup保存,可能还会涉及到查找,这样如果不是代码copy,就是UserService依赖UserGroupService显然不合理,当然UserGroup和UserService可以合并成一个Service,但是可能会导致合并后的Service膨胀。可能是Service划分不合理,不知道大家是怎么处理的。
b.鉴于以上原因UserGroupService和UserService仅仅处理简单的插入,处理简单的关系,然后提供一个供远程调用的会话门面,门面中包含UserGroupService和UserService,然后处理关系,可以很好解决a中遇到的情形,但是会发现service中有很多方法只是简单的调用dao中的方法,另外门面中也有很多方法只是简单的调用service中的方法,感觉处理的很别扭。
    各位牛人,大家一起交流一下,不知道大家理解清楚了没有?
分享到:
评论
9 楼 godspeed_yjx 2009-12-26  
挨个回答你的问题哈,个人意见:
1.插入UserGroup的时候,你可以先判断一下腰插入的User是否唯一,当然,这个要在业务逻辑中进行判断。
2>a:如果发现UserService会有很多代码会和UserGroupService相同的话,你也可以将相同的代码提取出来在另外一个Service里面做文章,然后用UserGroupService和UserService继承它。
2>b:这个就是程序的架构和对程序可扩展性的取舍了。如果你觉得这样直接调用dao里面的方法就可以,而且可以保证以后如果需求变更以后,你这个Service不会变,那其实这个service就没有什么意义,去掉也无妨。但是一般不支持这么做,业务的需求变更谁能说的准呢?而且,那样的话,整个程序的层次也就乱了。
8 楼 wslfh2008 2009-12-18  
个人感觉没必要用级联,直接业务处理就可以了,我们公司就这样做的,挺好的!
7 楼 ydxy425 2009-12-18  
遇到过和LZ差不多的问题。我们是
User与Department多对多
User与Role多对多

我当时做的时候是建立了
Userdept
   --id,userid,deptid
Userrole
   --id,userid,roleid
两个中间表来管理这两个多对多的关系。
6 楼 leiweisoft 2009-12-18  
个人觉得多对多应该拆成两个一对多去映射
5 楼 ximenpiaohua 2009-11-27  
感觉关系处理还是优点麻烦
4 楼 bevis.cn 2009-11-27  
我也比较喜欢把一个many-to-many的关系分成两个many-to-one的关系。
3 楼 tangbo530 2009-11-27  
我与楼上相反,我认为多对对关联映射比两个一对多要好
2 楼 ariestiger 2009-11-27  
个人觉得啊,如果说你准备设置多对多关系,最好拆成两个一对多,你可以把原来的关联表简单地做成一个类,再和你的用户,用户组什么的进行关联,这可能会产生一个基本上没什么实际业务意义的domain对象,但我想应该可以简化你的关系的处理,service中,你可以调用多个dao来添加用户,添加用户组,赋权限等,至于是不是用级联,那看你自己的需要了
1 楼 china_volcano 2009-11-25  
    级联关系是必要的,我觉得最好了User级联UserGroup,UserGroup级联Role,不然肯定会产生抛了了异常而不知道是什么异常的情况。

    引用你的话“ 这样的话,会发现UserService会有很多代码会和UserGroupService相同,因为保存User的时候涉及到UserGroup保存,可能还会涉及到查找,这样如果不是代码copy,就是UserService依赖UserGroupService显然不合理”,我觉得在一个模块中这两个service有依赖是很正常的事情;如果你的userGroupService中有对UserGroup进行验证之类的处理,可以用一个UserGroupManager来处理,这样可以复用了。

    再则我认为这里用门面模式来处理是不恰当的,当然有些人可能认为恰当,也是有他个人见解的。门面模式是为了把组件折开,但是又要让他们完成不同功能的组合。你这个除了新建一个用户(同时会新建用户组、角色)时调用保存用户(级联保存其他信息,没有就不保存),还有其他的地方会产生新用户并保存吗?Hibernate的优点就是可方便用户级联保存对象,如果不用的话,不知道后来看你代码的人有何看法。

相关推荐

    Apress - Pro Hibernate3

    Hibernate是一种开源的对象关系映射(ORM)框架,广泛应用于Java应用程序中,用于处理数据库交互。该书旨在为读者提供深入的Hibernate 3理解和应用能力。 #### 二、对象关系映射(ORM)概述 - **定义**:对象关系...

    hibernatetools文档

    - **社区论坛**:用户可以在论坛中交流心得、解决问题。 - **示例项目**:官方提供的示例项目有助于理解如何使用这些工具。 #### 二、下载与安装 **Hibernate Tools**的安装主要分为以下几个步骤: ##### 2.1 ...

    Hibernate插入数据

    本篇将详细探讨“Hibernate插入数据”的相关知识点,结合学习心得,深入理解并掌握其核心原理与实践技巧。 首先,Hibernate通过对象关系映射(ORM)技术,将数据库表与Java类关联起来,使得数据库操作可以通过对象...

    hibernate 开发指南下载

    文档内容不仅涵盖了Hibernate的基本使用方法,还融入了作者在实际项目中的经验积累以及与Hibernate官方论坛中多位技术专家的交流心得。 #### 二、目的与定位 本文档并非旨在取代Hibernate官方参考手册(Hibernate ...

    夏昕-Hibernate+开发指南.pdf

    - **主要内容**:涉及Hibernate框架的使用方法、实践经验以及作者在Hibernate官方论坛上的交流心得。 - **定位区别**:不同于Hibernate官方参考文档(Hibernate Reference),本文档旨在为开发者提供一个学习和掌握...

    Hibernate开发指南(原版书)

    本书不仅涵盖了Hibernate的基础概念和核心功能,还融入了作者在实际项目中的应用经验和与Hibernate社区专家交流的心得,使其内容更加丰富和实用。 ### Hibernate开发指南概览 #### 准备工作 - **环境搭建**:首先...

    Hibernate_DEV_GUIDE

    本文档主要介绍了Hibernate的使用方法和技术要点,不仅涵盖了Hibernate的基础知识,还融入了作者的实际工作经验及在官方论坛与其他技术专家交流的心得。作者强调本文并不是要取代Hibernate官方参考文档,而是旨在为...

    java学习感悟,对框架的学习心得

    在Java开发领域,框架的应用是不可或缺的一部分,它们极大地提高了开发效率和代码质量。本文主要探讨的是SSH框架,即Struts、Spring和Hibernate的使用...在与同行的交流中,可以碰撞出更多的灵感和解决方案,共同进步。

    MyEclipse_Hibernate_快速入门_中文版.

    - **定义**: Hibernate是一款流行的开源对象-关系映射(ORM)引擎,提供了一种将Java对象与数据库表之间的映射方式。 - **特点**: - 多种映射策略:支持一对一、一对多等多种映射方式。 - 可迁移的持久化:方便地...

    Spring框架在Java开发中的应用与心得

    ### Spring框架在Java开发中的应用与心得 #### 一、Spring框架概述 Spring框架自2004年发布以来,迅速成为了Java开发领域中最受欢迎的企业级应用开发框架之一。其核心设计思想旨在解决传统Java应用开发中存在的...

    hibernate1.rar_Java编程_Java_

    本资源“hibernate1.rar”正是针对这个主题,提供了作者个人在使用Hibernate过程中的实践经验和心得,旨在帮助初学者和进阶者更好地理解和应用Hibernate。 首先,让我们了解一下Hibernate的基本概念。Hibernate是...

    java版关于ssh技术的班级管理系统

    该系统还强调了“大家一起交流”,意味着它可能具备论坛或者讨论区功能,允许用户互动,分享学习心得,提问和解答问题。这样的功能可能需要用到Spring MVC中的Controller来处理用户提交的讨论内容,而Struts则负责...

    跑步社区(RunCommunity)

    在RunCommunity项目中,Hibernate被用来处理数据库操作,如用户信息、跑步记录等数据的存储和检索。通过Hibernate,开发者可以避免编写大量的SQL语句,转而使用面向对象的方式来操作数据库,提高了开发效率并降低了...

    (修改)基于javaee的鱼友交流论坛的设计与实现12.23.docx

    该论坛旨在为养鱼爱好者提供一个分享经验、交流心得、获取专业知识的平台。本项目采用了JAVAEE技术栈,包括SSH框架(Struts2、Spring、Hibernate)和SQL Server数据库管理系统。 #### 第1章 引言 ##### 1.1 项目...

    MyEclipse 6 中文教程

    Hibernate 3是一个流行的ORM(对象关系映射)框架,它消除了Java应用与数据库之间的低级交互,通过映射Java对象到数据库表,使得开发者可以使用面向对象的方式来处理数据。Hibernate 3提供了一套完整的查询语言HQL,...

    Java 技术提升.docx

    通过贡献代码,你可以看到实际项目中的问题处理,了解不同团队的编码规范,同时也可以获得社区的反馈和指导。例如,参与Apache或GitHub上的Java项目,可以让你在实践中不断提升。 最后,保持对Java技术的跟踪和更新...

    一个运动社区类论坛系统

    这样的系统旨在提供一个集讨论、分享、组织活动于一体的交流空间,用户可以在此交流运动心得,寻找运动伙伴,发布比赛信息等。 【描述】中提到,这个论坛系统是为新手设计的,意味着它的代码结构和逻辑相对清晰,...

    最新计算机实习日记范文.docx

    【计算机实习日记】系列主要记录了作者在计算机相关岗位实习过程中的体验和学习心得,涉及了编程、服务器配置、数据库管理、开源框架应用等多个方面。以下是根据日记内容提炼的知识点: 1. **实习的重要性**:实习...

    基于SSH的图书点评网站的设计与实-现毕业论文.doc

    在图书点评网站中,Hibernate可能是用于处理图书、用户、评论等数据的主要工具。 论文中提到,网站采用了MyEclipse作为开发环境,这是一款集成开发环境(IDE),支持多种Java应用开发,包括SSH项目。Tomcat服务器则...

Global site tag (gtag.js) - Google Analytics