设计细颗粒度的持久类并且使用<component>
来实现映射。
使用一个Address
持久类来封装 street
, suburb
, state
, postcode
. 这将有利于代码重用和简化代码重构(refactoring)的工作。
对持久类声明标识符属性( identifier properties)。
Hibernate中标识符属性是可选的,不过有很多原因来说明你应该使用标识符属性。我们建议标识符应该是“人造”的(自动生成,不涉及业务含义)。
使用自然键(natural keys)标识
对所有的实体都标识出自然键,用<natural-id>
进行映射。实现equals()
和hashCode()
,在其中用组成自然键的属性进行比较。
为每个持久类写一个映射文件
不要把所有的持久类映射都写到一个大文件中。把 com.eg.Foo
映射到com/eg/Foo.hbm.xml
中, 在团队开发环境中,这一点显得特别有意义。
把映射文件作为资源加载
把映射文件和他们的映射类放在一起进行部署。
考虑把查询字符串放在程序外面
如果你的查询中调用了非ANSI标准的SQL函数,那么这条实践经验对你适用。把查询字符串放在映射文件中可以让程序具有更好的可移植性。
使用绑定变量
就像在JDBC编程中一样,应该总是用占位符”?”来替换非常量值,不要在查询中用字符串值来构造非常量值!更好的办法是在查询中使用命名参数。
不要自己来管理JDBC connections
Hibernate允许应用程序自己来管理JDBC connections,但是应该作为最后没有办法的办法。如果你不能使用Hibernate内建的connections providers,那么考虑实现自己来实现org.hibernate.connection.ConnectionProvider
考虑使用用户自定义类型(custom type)
假设你有一个Java类型,来自某些类库,需要被持久化,但是该类没有提供映射操作需要的存取方法。那么你应该考虑实现org.hibernate.UserType
接口。这种办法使程序代码写起来更加自如,不再需要考虑类与Hibernate type之间的相互转换。
在性能瓶颈的地方使用硬编码的JDBC
In performance-critical areas of the system, some kinds of
operations might benefit from direct JDBC. But please, wait until you know
something is a bottleneck. And don’t assume that direct JDBC is
necessarily faster. If you need to use direct JDBC, it might be worth
opening a Hibernate Session
and using that
JDBC connection. That way you can still use the same transaction
strategy and underlying connection provider.
在系统中对性能要求很严格的一些部分,某些操作也许直接使用JDBC会更好。但是请先确认
这的确是一个瓶颈,并且不要想当然认为JDBC一定会更快。如果确实需要直接使用JDBC,那么最好打开一个 Hibernate Session
然后从 Session
获得connection,按照这种办法你仍然可以使用同样的transaction策略和底层的connection provider。
理解Session
清洗( flushing)
Session会不时的向数据库同步持久化状态,如果这种操作进行的过于频繁,性能会受到一定的影响。有时候你可以通过禁止自动flushing,尽量最小化非必要的flushing操作,或者更进一步,在一个特定的transaction中改变查询和其它操作的顺序。
在三层结构中,考虑使用托管对象(detached object)
当使用一个servlet / session bean 类型的架构的时候, 你可以把已加载的持久对象在session bean层和servlet / JSP 层之间来回传递。使用新的session来为每个请求服务,使用 Session.merge()
或者Session.saveOrUpdate()
来与数据库同步。
在两层结构中,考虑使用长持久上下文(long persistence contexts).
为了得到最佳的可伸缩性,数据库事务(Database Transaction)应该尽可能的短。但是,程序常常需要实现长时间运行的“应用程序事务(Application Transaction)”
,
包含一个从用户的观点来看的原子操作。这个应用程序事务可能跨越多次从用户请求到得到反馈的循环。用脱管对象(与session脱离的对象)来实现应用程
序事务是常见的。或者,尤其在两层结构中,把Hibernate
Session从JDBC连接中脱离开,下次需要用的时候再连接上。绝不要把一个Session用在多个应用程序事务(Application
Transaction)中,否则你的数据可能会过期失效。
不要把异常看成可恢复的
这一点甚至比“最佳实践”还要重要,这是“必备常识”。当异常发生的时候,必须要回滚 Transaction
,关闭Session
。如果你不这样做的话,Hibernate无法保证内存状态精确的反应持久状态。尤其不要使用Session.load()
来判断一个给定标识符的对象实例在数据库中是否存在,应该使用Session.get()
或者进行一次查询.
对于关联优先考虑lazy fetching
谨慎的使用主动抓取(eager
fetching)。对于关联来说,若其目标是无法在第二级缓存中完全缓存所有实例的类,应该使用代理(proxies)与/或具有延迟加载属性的集合
(lazy collections)。若目标是可以被缓存的,尤其是缓存的命中率非常高的情况下,应该使用lazy=”false”
,明确的禁止掉eager fetching。如果那些特殊的确实适合使用join fetch 的场合,请在查询中使用left join fetch
。
使用open session in view
模式,或者执行严格的装配期(assembly phase)
策略来避免再次抓取数据带来的问题
Hibernate让开发者们摆脱了繁琐的Data Transfer Objects
(DTO)。在传统的EJB结构中,DTO有双重作用:首先,他们解决了entity
bean无法序列化的问题;其次,他们隐含地定义了一个装配期,在此期间,所有在view层需要用到的数据,都被抓取、集中到了DTO中,然后控制才被装
到表示层。Hibernate终结了第一个作用。然而,除非你做好了在整个渲染过程中都维护一个打开的持久化上下文(session)的准备,你仍然需要
一个装配期(想象一下,你的业务方法与你的表示层有严格的契约,数据总是被放置到托管对象中)。这并非是Hibernate的限制!这是实现安全的事务化
数据访问的基本需求。
考虑把Hibernate代码从业务逻辑代码中抽象出来
把Hibernate的数据存取代码隐藏到接口(interface)的后面,组合使用DAO
和Thread Local Session
模式。通过Hibernate的UserType
,你甚至可以用硬编码的JDBC来持久化那些本该被Hibernate持久化的类。 (该建议更适用于规模足够大应用软件中,对于那些只有5张表的应用程序并不适合。)
不要用怪异的连接映射
多对多连接用得好的例子实际上相当少见。大多数时候你在“连接表”中需要保存额外的信息。这种情况下,用两个指向中介类的一对多的连接比较好。实际上,我们认为绝大多数的连接是一对多和多对一的,你应该谨慎使用其它连接风格,用之前问自己一句,是否真的必须这么做。
偏爱双向关联
单向关联更加难于查询。在大型应用中,几乎所有的关联必须在查询中可以双向导航。
分享到:
相关推荐
C语言程序设计之(一)手机通讯录管理系统
清华大学2023级物理学专业本科培养方案
1、文件内容:docbook5-style-xsl-extensions-1.78.1-4.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/docbook5-style-xsl-extensions-1.78.1-4.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
网络爬虫简介, 介绍了网络爬虫, 并讲解了爬取网站的方法。 数据抓取,展示了如何从网 页中抽取数据。 下载缓存, 学习了如何通过缓存结果避免重复下载的问题。 并发下载, 通过并行下载加速数据抓 取。 动态内容, 展示了如何从动态网 站中抽取数据。 表单交互, 展示了如何与 表单进行交互, 从而访问你需要的数据。 验证码处理, 阐述了如何访问被验证码图像保护的数据。 Scrapy, 学习了如何使用流行的高级框架 Scrapy。
2025最新电力安全工作规程考试题及答案.doc
2025最新手术室考试题及答案.doc
1、文件内容:environment-modules-3.2.10-10.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/environment-modules-3.2.10-10.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
2025医疗三基三严知识试题题库(附答案).docx
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
通过线性规划在不同风险度下的最优投资组合的MATLAB仿真代码。MATLAB代码通过线性规划(linprog)模拟不同风险度下的最优投资组合。代码初始化风险度 a,并逐步增加至0.05。在每个风险度下,定义目标函数、约束条件和等式约束,调用linprog求解最优投资比例,计算收益并绘制风险度与收益的关系图。该模型展示了如何在风险与收益间权衡,为投资决策提供参考。
科学计算器程序QZQ
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1、文件内容:farstream-0.1.2-8.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/farstream-0.1.2-8.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
1、文件内容:fence-agents-rhevm-4.2.1-41.el7_9.6.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/fence-agents-rhevm-4.2.1-41.el7_9.6.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
关于数据集 城市交通和车辆行为数据集是与城市交通和车辆行为相关的各种因素的数据集合。以下是数据集中每列的描述: 1. 城市:收集数据的城市名称。 2. 车辆类型:交通中涉及的车辆类型(例如汽车、卡车、公共汽车、摩托车)。 3. 天气:数据收集时的主要天气状况(例如晴天、下雨、下雪)。 4. 经济状况:城市普遍的经济状况(例如,繁荣、衰退、稳定)。 5. 星期几:收集数据的星期几(例如星期一、星期二等)。 6. 一天中的小时:收集数据的时间,通常以 24 小时格式表示。 7. 速度:交通中车辆的速度,以英里每小时 (mph) 或公里每小时 (km/h) 为单位。 8. 是否是高峰时段:二进制指示符(0 或 1),指示是否在高峰时段收集数据。 9. 发生随机事件:二进制指示符(0 或1),指示在数据收集期间是否发生任何随机事件(例如事故、道路封闭)。 10. 能源消耗:车辆的能源消耗,通常以燃料消耗或用电量来衡量。 该数据集可用于多种目的,例如分析交通模式、研究天气和经济条件对交通的影响、评估能源消耗趋势以及预测交通拥堵。研究人员和交通规划者可能会发现该数据集对于理解和改善城市交通非常
资源内项目源码是均来自个人的课程设计、毕业设计或者具体项目,代码都测试ok,都是运行成功后才上传资源,答辩评审绝对信服的,拿来就能用。放心下载使用!源码、说明、论文、数据集一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 4、如有侵权请私信博主,感谢支持
2025医院招聘护士考试题库(附答案).doc
基于双层优化的电动汽车充放电行为调度研究:时空协同,选址定容与风电适应性分析,MATLAB+CPLEX仿真平台下的策略探究,电动汽车 双层优化 选址定容 输配协同 时空优化 MATLAB代码:基于双层优化的电动汽车优化调度研究 参考文档:考虑大规模电动汽车接入电网的双层优化调度策略 仿真平台:MATLAB+CPLEX 平台 主要内容:代码是一个双层的电动汽车充放电行为优化问题,具体来讲,输电网上层优化将电动汽车与发电机、基本负荷协调,同时考虑风力发电,从而在时域内优化电动汽车的负荷周期。 然后,配电网的下层优化在空间上调度电动汽车负荷的位置。 同时代码考虑了风电的出力场景,研究了不同风电出力下电动汽车的适应性,该代码具有一定的创新性 ,电动汽车; 双层优化; 选址定容; 输配协同; 时空优化; MATLAB代码; 风电出力场景。,基于MATLAB的电动汽车双层优化调度策略研究:时空协同与选址定容优化
2025医院收费员考试试题及答案.docx
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat