hibernatejpa:Hibernate/JPA成功使用的十点心得体会

  大约年以前我为了学习些Hibernate专业知识因此我参加了个Hibernate项目从那时起直在使用Hibernate框架下JPA(Java持久API)实现使用思想仍就是那个项目使用了个数据库这个数据库规模有些大略显落后并且还被许多应用共用为了尽快加入到项目中我开始学习些Hibernate知识从书本上例子开始学习感觉很简单学起来也很快但是发现从零开始开发个项目并且控制它又是另外回事了试着在个大型复杂被许多应用共用数据库上使用Hibernate就又完全区别了弄清楚了我可能遭遇到技术难点我开始想别招了要尽快从另外方向开始克服困难

  在最终学习和实战中我发现我还是学到了许多重要东西虽然我们项目还没有完全做完但是我认为我们目前已经非常漂亮应用了Hibernate/JPA些思想现在我需要重新研究反省我所学到东西如下便是我学到些心得体会:

  1)和数据库管理员成为朋友

  目前存在个趋势就是些Java开发者忽视数据库管理员重要性这便犯了个很大对于要取得任何ORM(对象关系映射)技术成功和数据库管理员保持个良好工作关系是至关重要有如下两个原因:

  单独数据库管理员虽然不能使Hibernate项目成功但是他们通常可以让这些项目失败

  数据库管理员对数据库本身具有很好洞察力很好职业习惯告诉你些易犯和操作建议我能记起这样很多例子个数据库管理员建议节约了我们很多时间和提供给我们个很好解决方案

  在大多数情况下拥有好数据库管理员并且和他们保持良好关系对你ORM(对象关系映射)工作至关重要

  2)从开始使用(最好强制使用)好命名标准

  我们知道对命名标准讨论将会有争议但是我们必须明确件事情我们命名要让我们数据模型有意义这能让开发者使用起来简单以免他们迷惑所以如何命名实体和属性是非常重要我有我喜欢命名标准并且认为他们是最好但是在这里我不想把他们强加于你们最重要是你自己做出决定使用什么样命名标准并且让所有人使用它实际上不仅仅命名标准需要统其它也需要(如布尔型用“Y/N” 或者 0/1表示)

  3)不要试着映射所有属性

  我们总是设法使用工具如Dali来映射所有东西然后形成张表格(些表格有上百列 !)这最终会很麻烦为什么?我们使用是共用先前数据库有许多字段是我们并不关心和从来不使用映射它们只会导致性能问题和造成混乱

  4)让数据库做自己擅长工作

  我们想有个好清晰数据模型因此我们不惜任何代价写些额外查询语句来获取对象相关数据要么使用存储过程要么使用这是做法是数据库优势在于存储而不是保持Hibernate创建或读写数据举个例子我们有个对象和的相关联个状态这个状态在整个应用中都要用到因此它毫无疑问是要执行但是我们不想每次都要单独个查询语句这个问题在于这个状态是从些统计计算中派生出来并且这些统计计算需要用到对多关系每次从加载对象中读取数据代价是非常高后来跟我们其中位数据库管理员交流了发现个我们可以使用sql能够很快获得该状态我们使用@Formula来映射成个状态属性就能得到我们所需要所有东西这仍就是域模型部分但是执行起来非常好有时像这样个折衷办法能够起到很大效果

  5)分解数据库

  在开始我就想在Hibernate中模型化整个数据库结果发现这是不切实际原因如下:

  a)这是项巨大工程并且要花费几周时间而用户根本看不到你做了什么实际工作

  b)我不可能在第次就把它弄好后继开发者无论如何都会修改它们

  现在有个趋势就是希望在开始的前将所有事情都进行映射但是当时你开始这么做后你不需在这上面花很多时间我后来发现个好办法就是将数据库分解工作时候进行发现这很有帮助

  6)密切注意触发器

  密切注意数据库触发器有如下两个原因:

  a)在后台触发器很隐蔽执行了些功能让你很是疑惑不知道发生了什么

  b)当你在Hibernate端需要复制些东西时候触发器会做些手脚的前我们好几次没有认识到这个教训导致我们丢失了很多数据这些都是由触发器引起这几乎让我们很是郁闷

  7)避免使用工具来自动生成你模型

  没错这些工具使用可以节约时间(虽然我们发现了Dali有个很严重bug,但是我们还是使用它)但是最后你不得不重新做很多事情其实手动也花费不了你很多时间当你亲自做时候这可以让你有机会熟悉那些数据

  8) 尽量多使用命名查询语句(NamedQueries)

  虽然很容易写查询语句但是在许多情况下使用NamedQueries会更好这会有助于你完成两件事情:

  a)它能更加重用被命名查询语句通常在代码重要地方

  b)你查询语句在开始时候就是正确那么在查询语句中更加容易发现

  要习惯这样做需要花些时间但是这么做是值得

  9)预期管理



  对于任何种框架、技术、甚至观念来说这是非常重要要铭记在心由于某些原因人们倾向于专注某个特征这些特征实际上或许不存在或许被夸大有时它很小很容易理解(举个例子理解些实际工作需要在Hibernate中映射)有时我也不知道他们是如何管理实现些概念(如Hibernate是如何管理计划修正)无论如何找到预期目标是什么然后管理它们是非常重要如果你团队(Team)认为Hibernate会使得数据库管理员没有用处把他们解雇那么你将会有个潜在问题存在

  10)使用富域模型(rich do modeling)

  我所遇到件很悲哀事情就是在域对象仅仅是个简单数据容器时候我要使用Hibernate而像Hibernate这样工具让我们以面向对象方式来使用数据简单映射数据只是让我们停留在中途当我本能想到使用富域模型(rich do modeling)时候我发现我们可以重用很多代码我们其它层变得不那么混乱了并且我们代码更加容易测试



Tags:  strutshibernate hibernate分页 hibernate hibernatejpa

延伸阅读

最新评论

发表评论