先简单介绍一下问题的语境。
手头有个开发了3年的Spring+iBATIS应用(经典三层架构),最近尝试用Hibernate实现原有SQLMap版的部分CRUD操作。除开混合事务和其他一些底层配置细节(如TransactionAwareDataSource、禁用lazy-load等)之外,最大的一个"pattern-mismatch"是:Model层和持久层采用了dirty flag机制,即每次INSERT和UPDATE操作,都会根据每个字段的dirty与否决定是否参加INSERT/UPDATE,而这些dirty flag可以被外部重置,所以业务层的代码,经常可以看到类似这样的pattern:
1- new一个model类并setId() (或者在已有的model上重置dirty flag)
2- set需要update的字段(通常都只是部分字段)
3- 丢给DAO层去update
最终的效果是某张表某个ID的某条记录的某些字段被更新了,而其他字段不受影响,这就是我在标题中提到的所谓"暴力"update,虽不elegant,但却也简单实用,至少很"直接"。
为了让Hibernate版的DAO(默认除Trasient之外全体字段参加INSERT和UPDATE)继续支持这样的"use-pattern",除了按照Hibernate的习惯去配置映射和SessionFactory等之外,我们需要做一些额外的工作:
1- 在BO/Entity类上追加注解
<!---->@org.hibernate.annotations.Entity(dynamicInsert
=
true
, dynamicUpdate
=
true
)
2- 实现org.hibernate.Interceptor接口的findDirty()方法,Hibernate提供了一个EmptyInterceptor可以作为起点,方法签名如下:
<!---->public
int
[] findDirty(
Object entity,
Serializable id,
Object[] currentState,
Object[] previousState,
String[] propertyNames,
Type[] types
);
返回的int[]包含所有应该被认为是dirty的字段索引,返回null表示默认处理,传入的entity是持久对象,字段列表会通过propertyNames参数传给你。
3- 注入到Spring的Application Context中,类似这样:
<!----><
bean
id
="findDirtyInterceptor"
class
="gao.sean.hybrid.interceptor.FindDirtyInterceptor"
/>
<
bean
id
="sessionFactory"
class
="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
>
<
property
name
="entityInterceptor"
><
ref
bean
="findDirtyInterceptor"
/></
property
>
</
bean
>
在这样的配置下,业务层的代码就可以继续"暴力"update了。
分享到:
相关推荐
Agile Java™ Development With Spring, Hibernate and Eclipse is a book about robust technologies and effective methods which help bring simplicity back into the world of enterprise Java development....
Agile Java™ Development With Spring, Hibernate and Eclipse is a book about robust technologies and effective methods which help bring simplicity back into the world of enterprise Java development....
【Nginx基础应用】 ...由Igor Sysoev为Rambler.ru站点开发,以其稳定性、丰富的功能集和低资源消耗而广受赞誉。在中国,Nginx已被众多知名网站如新浪、网易、腾讯等采用,成为了网络基础设施的重要组成部分。...
[前言]: 编写此技术指南在于推广普及NGINX在国内的使用,更方便的帮助大家了解和掌握NGINX 的一些使用技巧。本指南很多技巧来自于网络和工作中或网络上朋友们问我的问题.在此对 网络上愿意分享的朋友们表示感谢和...
【Nginx基础知识】 ...它由Igor Sysoev为Rambler.ru站点开发,该站点在Nginx运行期间拥有极高的访问量。Nginx以其稳定性、丰富的功能、简洁的配置文件和低资源消耗而著称。 **Nginx的优点** ...2. **反向代理**:Nginx...
Spring-Hibernate-示例使用 Spring、Hibernate、Gradle、Eclipse、Tomcat、Mysql 的 Java Web 应用程序框架。 ##tips 如果您正在构建一个 web 应用程序,请确保您应用 'eclipse-wtp' 插件而不是 'eclipse'。
PaloAlto
随着信息技术的快速发展和物流行业的需求升级,如何高效地管理物流系统中的信息流、物流和资金流成为了关键问题之一。传统的解决方案往往难以满足现代物流系统对灵活性、扩展性和性能的要求。在此背景下,《很不错的...
文件已上传到百度网盘,附件中是下载地址。... Hibernate-A.Developer's.Notebook—Hibernate程序高手秘笈 [美] james elliott(著) | o'reilly taiwan公司编译(译) | 东南大学出版社 | 9787564106379 |
abap tips abap tips abap tips abap tips abap tips
本项目“spring-tips-spring-state-machine”提供的是Spring State Machine相关的源代码示例,适用于那些希望深入理解和使用Spring State Machine的Java开发者。 Spring State Machine的核心概念包括状态(State)...
开始Hibernate之旅 1.2. 第一个可持久化类 1.3. 映射cat 1.4. 与猫同乐 1.5. 结语 2. 体系结构 2.1. 总览 2.2. JMX集成 2.3. JCA支持 3. SessionFactory配置 3.1. 可编程配置方式...
以上就是对文件《Best+of+VIM+Tips(译注).pdf》中的VIM编辑器相关知识点的总结。VIM提供的这些替换命令和操作技巧可以大幅提高文本处理的效率,是学习VIM编辑器时需要掌握的重要内容。在实际使用中,合理运用这些...
Building RESTful Web Services with Spring 5 – Second Edition: Leverage the power of Spring 5.0, Java SE 9, and Spring Boot 2.0 Find out how to implement the REST architecture to build resilient ...
Along with detailed analysis of the code and functionality, plus the first published coverage of Spring Web Flow 2.x, this book includes numerous tips and tricks to help you get the most out of ...
例如,`update()`用于执行修改操作,如INSERT、UPDATE和DELETE;`query()`用于查询,返回结果通常为`ResultSet`;`queryForList()`则用于获取列表形式的结果集。此外,还可以使用`callProc()`来调用存储过程。 在...
本文将详细讲解如何使用基于jQuery的Tips插件,该插件允许提示框自动消失或由用户手动消失,从而为用户提供更加友好的交互体验。 首先,我们来了解jQuery Tips插件的基本概念。Tips插件主要用于在网页上显示临时...