`
linliangyi2007
  • 浏览: 1012608 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

项目经验分享:Hibernate与充血模型的“冲突”

阅读更多
“冲突”问题发生在将旧有项目进行充血模型改造的过程。我们给原有Bean的set方法中加入了业务逻辑(如上下文状态改变,事件触发等)。接下来程序的执行出问题了,症状五花八门但常常都是不可重现的问题。

通过好一番的代码走查,终于发现(意识到)Hibernate对于Bean的加载时,默认属性值的传递是使用bean的set方法的,这个时候触发了多余的业务逻辑处理。换句话说,这时候的充血模型与Hibernate的Bean加载“冲突"了。

解决"冲突"的方法很简单,将Bean配置为直接的属性访问(acess=feild)。

这样的Bug有时候是隐藏得比较深的。因为大部分的set方法是没有业务逻辑的,而且Hibernate的save行为发生在session.close的时候,如果一个bean在加载的时候,通过set方法隐形改变了另外一个Bean的状态,这时候session.close,就会把这种修改“悄悄的”保存,而不被程序员发觉。因为从业务代码上,程序只是读取了一个bean,没有做任何的修改动作,我的天~~~血泪教训啊!

希望看到这个帖子的同学,大家告诉大家!



分享到:
评论
5 楼 linliangyi2007 2009-04-03  
楼上的几位,把业务逻辑加在set中可不是本人发明的专利,你们可以look一下国外顶顶大明的开源JBPM的源码,他们就是这样做的啊~~~

再说,java的编程规范从来也没有规定不能在set中加业务逻辑啊!这个是设计的需要吧,当然也有个人习惯问题,但个人觉得没有好坏之分的。

这个帖子只是指出在hibernate使用中的一个问题,希望大家注意而已。因为这样的bug不容易发现,希望看到的同学们能注意,避免弯路
4 楼 mshijie 2009-04-03  
在setter中加逻辑,也应该式取值合法性验证才合理。这样hibernate也不应该引起bug
3 楼 coolnight 2009-04-03  


中了充血模型的毒了


kunee 写道
怎么会在SET里加业务逻辑,相当犀利

2 楼 kunee 2009-04-03  
怎么会在SET里加业务逻辑,相当犀利
1 楼 h521999 2009-03-10  
学习了,感谢楼主!不过还从没有在bean的set方法中去加入业务逻辑!

相关推荐

    充血模型设想实现(2010/07/30更新)

    在2010年的更新中,博主可能讨论了如何在实际项目中应用充血模型,可能涉及到以下几点: 1. **业务逻辑封装**:在充血模型中,业务逻辑被封装在领域对象内部,这样可以保持对象的状态完整性和行为一致性。比如,一...

    hibernate4.jar

    Hibernate是一款强大的对象关系映射(ORM)框架,它极大地简化了Java应用与数据库之间的交互。本文将详细探讨hibernate4.jar的核心功能,以及如何利用它来构建一个完整的Hibernate框架。 首先,`hibernate4.jar`是...

    hibernate与webligic之前是冲突

    关联一个hibernate、webLogic的一个文档,可以快速的查找关于hibernate和weblogic的冲突

    真实项目:Hibernate3.3.2+Spring3.0+Struts2.2.3+ext3.4.0

    项目配置:Hibernate3.3.2+Spring3.0+Struts2.2.3 + ext3.4.0,真实项目实现,项目中可参考经典权限设计,通用数据录入,批量数据处理(poi),统一的JSON格式封装,灵活的组合模式设计,EXTJS面向组件编程参考......

    Beginning Hibernate: For Hibernate 5

    ### 关于《Beginning Hibernate: For Hibernate 5》的知识点总结 #### Hibernate 5 概述 - **定义**: Hibernate 是一款流行的开源对象关系映射(ORM)框架,它简化了数据库与 Java 对象之间的交互过程。 - **版本**...

    hibernate E-R模型关系配置

    6. **HQL与Criteria查询**:Hibernate支持使用Hibernate Query Language(HQL)进行对象级别的查询,类似于SQL但面向对象。此外,还有Criteria API,提供了一种类型安全的查询方式。 7. **事务管理**:在处理数据库...

    图书:Hibernate入门 - 第二版

    通过阅读《Hibernate入门 - 第二版》,初学者可以快速掌握Hibernate的基本使用,而有一定经验的开发者则能进一步提升自己的ORM技能,更好地在实际项目中运用Hibernate。提供的PDF文件“Apress.Beginning.Hibernate....

    spring+hibernate包冲突问题

    在开发Java Web应用程序时,Spring和...通过以上步骤和策略,大多数Spring与Hibernate的包冲突问题都可以得到解决。在实际开发过程中,应始终关注框架的新版本和官方文档,以便获取最新的兼容性和最佳实践信息。

    hibernate3必要jar包

    Hibernate3 是一个非常重要的Java持久化框架,它允许开发者将对象模型与数据库关系模型进行映射,从而简化了数据存取的过程。这个压缩包“hibernate3必要jar包”显然是针对Hibernate3版本的,已经去除了冗余的库文件...

    Struts2.1 Core与Hibernate3.3冲突解决【去jar】

    提供的RAR文件“Struts2.1 Core与Hibernate3.3冲突解决【去jar】”应该包含了整个解决过程中的相关文件,包括可能需要移除的jar文件、更新后的库以及可能的配置示例。开发者可以根据实际情况参考这个文件包来解决...

    spring与hibernate的包冲突

    总的来说,处理Spring与Hibernate的包冲突需要对Java项目的构建系统有深入理解,熟悉Maven或Gradle的依赖管理,以及对Spring和Hibernate的工作原理有清晰的认识。通过合理的配置管理和版本控制,可以有效地避免和...

    hibernate与mybatis一起使用取长补短

    标题“hibernate与mybatis一起使用取长补短”暗示了在一个项目中同时采用这两种框架,旨在充分利用它们各自的优点,以提升项目的性能和灵活性。 Hibernate是一款强大的ORM框架,它提供了完整的对象模型支持,包括...

    hibernate学习资料大全

    Hibernate 提供了一种将Java对象模型与关系数据库之间的映射机制,使得开发者可以使用面向对象的方式来操作数据库,而无需关心底层SQL语句。理解ORM的概念是学习Hibernate的第一步。 2. **Hibernate配置**: 在...

    Hibernate使用指南

    * 配置 Hibernate:在 hibernate.cfg.xml 文件中配置 Hibernate 的一些常用信息,例如 JDBC 连接数据库的信息。 * 使用 Hibernate:使用 Hibernate 来操作数据库,例如执行查询、插入、更新、删除等操作。 四、 ...

    hibernate3.6

    Hibernate 3.6 是一个流行的Java对象关系映射(ORM)框架的重要版本,它极大地简化了数据库操作,将复杂的SQL语句与Java对象之间建立了桥梁。在这个版本中,Hibernate提供了许多增强的功能和优化,旨在提高开发效率...

    hibernate的资料文件下载

    8. **一对多、多对一、一对一和多对多关系映射**: Hibernate支持多种关联关系映射,便于处理复杂的数据模型。 9. **延迟加载(Lazy Loading)**: Hibernate提供懒加载机制,只有在真正需要访问关联对象时才会执行...

    hibernate项目

    【hibernate项目】是一个基于Java的开源对象关系映射(ORM)框架,它简化了数据库与Java应用程序之间的数据交互。Hibernate提供了一种在Java应用中管理关系数据库模型的机制,使得开发人员可以使用面向对象的编程...

    hibernate-commons-annotations-4.0.1.Final.jar

    hibernate-commons-annotations-4.0.1.Final.jar

    HibernateAPI_ORG

    8. 动态模型:Hibernate支持动态模型,允许在运行时定义实体类,增强了代码的灵活性。 在" HibernateAPI_ORG "这个资源中,可能包含以下内容: - API文档:详细说明了每个类、接口和方法的功能和使用方式,是...

    Hibernate 4.1.1中文文档

    1. **Hibernate概述**:Hibernate提供了一种在Java应用程序中持久化对象的机制,通过将对象模型转换为关系数据模型,使得开发者可以专注于业务逻辑而不是底层的数据库操作。 2. **安装与配置**:文档详细解释了如何...

Global site tag (gtag.js) - Google Analytics