精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2014-03-09
最后修改:2014-03-09
xiayh04 写道 ThinkingQuest 写道 请问大家为什么用hibernate?关于这点,我真的是一直没弄明白
我猜猜(有可能不对):你应该没有太多的开发经验。一上来,就接触hibernate,jdbc会用,觉得挺好的。 其实hibernate之所以流行,就是大家多jdbc开发很是郁闷,长时间写的复杂的项目,后期很难维护。 如果我猜对了,等你再干两年你就知道了(或者自己试着去写一个不用hibernate的,稍微业务逻辑复杂一点的项目(肯定不是全写出来,想想如果不用的话,会是怎么样))。说再多都没有用。 虽然比较菜,但是开发经验还是有一些的。之前做过保险行业的软件,后来几年都是在互联网行业。 做软件那会就没弄明白为什么要用hibernate。 有老同事给讲过,依稀记得是说hibernate填补了面向对象的程序语言,与关系型数据库之间的鸿沟,让程序员可以用面向对象的思想进行数据存取操作。 当初虽不甚解,但也觉得有道理。 这些年凡用到数据库的时候,多半都是用spring的jdbc template,还有就是公司自己做的一个简单的封装,从代码的写法上,也和jdbc temlate比较接近。 但是做了一些诸如sharding,主从分离(我们用的mysql,有时候写主库,读从库)等。 还有些方便切库(线上的大表修改字段可能需要切来切去的),高可用性等方面的考虑。 有时候我在想,这些东西能否和hibernate良好的结合。可能是先入为主的不喜欢hibernate,所以就没多想。 还有些场景,比如性能严苛一点的地方,假如一个表有10个字段,我只取其中的1个, 那么就只select这一个字段。 如果完全用ORM,把整个表都映射到一个objec,那么数据库server就需要把所有的column的值都读出来,发送到程序server,但程序server只取了需要用的1个字段,其它的等于是丢弃。 也许有人说这点性能开销无所谓,但我觉得要做到极致,要用最正确的方式去做,还是要考虑。类似这种场景,也不知道hibernate是否还适用。 也许有办法,但我对hibernate了解甚少,可能不知道吧。 总之就是对比之前用hibernate的时候,现在没有使用hibernate,并没有觉得有什么不妥。 存在即合理,hibernate有这么多人用,那么必定有可取之处。所以那自然就是我自己没弄明白了。故此有此一问。 |
|
返回顶楼 | |
发表时间:2014-03-10
ThinkingQuest 写道 xiayh04 写道 ThinkingQuest 写道 请问大家为什么用hibernate?关于这点,我真的是一直没弄明白
我猜猜(有可能不对):你应该没有太多的开发经验。一上来,就接触hibernate,jdbc会用,觉得挺好的。 其实hibernate之所以流行,就是大家多jdbc开发很是郁闷,长时间写的复杂的项目,后期很难维护。 如果我猜对了,等你再干两年你就知道了(或者自己试着去写一个不用hibernate的,稍微业务逻辑复杂一点的项目(肯定不是全写出来,想想如果不用的话,会是怎么样))。说再多都没有用。 虽然比较菜,但是开发经验还是有一些的。之前做过保险行业的软件,后来几年都是在互联网行业。 做软件那会就没弄明白为什么要用hibernate。 有老同事给讲过,依稀记得是说hibernate填补了面向对象的程序语言,与关系型数据库之间的鸿沟,让程序员可以用面向对象的思想进行数据存取操作。 当初虽不甚解,但也觉得有道理。 这些年凡用到数据库的时候,多半都是用spring的jdbc template,还有就是公司自己做的一个简单的封装,从代码的写法上,也和jdbc temlate比较接近。 但是做了一些诸如sharding,主从分离(我们用的mysql,有时候写主库,读从库)等。 还有些方便切库(线上的大表修改字段可能需要切来切去的),高可用性等方面的考虑。 有时候我在想,这些东西能否和hibernate良好的结合。可能是先入为主的不喜欢hibernate,所以就没多想。 还有些场景,比如性能严苛一点的地方,假如一个表有10个字段,我只取其中的1个, 那么就只select这一个字段。 如果完全用ORM,把整个表都映射到一个objec,那么数据库server就需要把所有的column的值都读出来,发送到程序server,但程序server只取了需要用的1个字段,其它的等于是丢弃。 也许有人说这点性能开销无所谓,但我觉得要做到极致,要用最正确的方式去做,还是要考虑。类似这种场景,也不知道hibernate是否还适用。 也许有办法,但我对hibernate了解甚少,可能不知道吧。 总之就是对比之前用hibernate的时候,现在没有使用hibernate,并没有觉得有什么不妥。 存在即合理,hibernate有这么多人用,那么必定有可取之处。所以那自然就是我自己没弄明白了。故此有此一问。 看来我猜错了。兄弟经验还是不错的。其实你说的问题,确实是hibernate的问题所在:没有直接用sql灵活。 凡事都有两面性,(哦,顺便说一下,我不是要提hibernate卫道哦,也不管我毛事~纯技术讨论)。灵活的另一面,就是同查询结果,每个人写出来的都不一样:特别针对复杂的查询,有经验的和没有经验的,更是云泥之别。 不展开了,说说我们这边怎么用(供参考):我这边用hibernate+spring jdbc,但是规定是,用spring jdbc必需满足两点: 1 性能有很大提升。 2 无法用hibernate解决。 |
|
返回顶楼 | |
发表时间:2014-03-10
如果这个世界上有一款ORM工具,性能和直接jdbc一样猛,oo程度和hibernate一样高。
那就不用讨论了是不是。所以,一切抛弃场景谈谁好谁烂都是没意义的。 hibernate最大的优点其实就是和java一样的,稳定,可维护性高的工业产品,1年经验和10年经验来写80%的东西都差不多,多年以后回来维护老代码一眼就能看明白。 另外如果从性能来说,说真的,性能和hibernate真的没太大关系,和你这个团队会不会用hibernate有关。 |
|
返回顶楼 | |
发表时间:2014-03-10
leobluewing 写道 如果这个世界上有一款ORM工具,性能和直接jdbc一样猛,oo程度和hibernate一样高。
那就不用讨论了是不是。所以,一切抛弃场景谈谁好谁烂都是没意义的。 hibernate最大的优点其实就是和java一样的,稳定,可维护性高的工业产品,1年经验和10年经验来写80%的东西都差不多,多年以后回来维护老代码一眼就能看明白。 另外如果从性能来说,说真的,性能和hibernate真的没太大关系,和你这个团队会不会用hibernate有关。 不能同意更多。我公司的系统,没有任何HQL或者SQL,牵扯到数据库操作的全部都用hibernate解决,业务逻辑相当严谨。 当然业务逻辑相对复杂的操作可以直接用存储过程来解决。 Hibernate是一个企业级的框架,如果对于业务逻辑的严谨度没那么高要求的小公司,又有自己的测试团队帮忙擦屁股,开发人员很可能会觉得hibernate很臃肿。 引用一句话,If sex is a pain in the ass, then you are doing it wrong... |
|
返回顶楼 | |
发表时间:2014-03-10
hibernate带来的是一种面向对象操作数据的思路。如果你不是用数据级联,不以面向对象的思维去看系统,去看orm层。那还不如直接使用ibatis此类的半自动化工具,让你的sql本领得到完全的体现。
|
|
返回顶楼 | |
发表时间:2014-03-14
我觉得hibernate是非常有必要的
对于现在的数据库而言都是关系型数据库 通过传统的jdbc之类的很难让整个系统都是面向对象。 比如有2个对象 老师 、教导主任 学生 假设一个学生只有一个老师 假设一个老师只有一个教导主任 第一个业务 根据学生id查出学生和老师的名字 sql: select Teacher.name ,Student.name from Teacher join Student on Student.TeacherId = Teacher.id where Student.id = 1 oo: Student.getTeacher().getName(); Student.getName(); 其实还有一个教导主任。 新业务 显示学生 对应 的 教导主任(Headmaster) 我们就只能改sql了 sql: select Teacher.name ,Student.name ,Headmaster name from Teacherjoin Studenton Student.TeacherId = Teacher.id join Headmaster on Headmaster.id = Teacher.HeadmasterId where Student.id = 1 oo: Student.getTeacher().getName; Student.getName(); Student.getTeacher().getHeadmaster().getName() 如果用面向对象的感觉,你不需要改任何sql 而且在jsp中就可以实现,你甚至不用编译代码。 把所有对象的关系确立了通过一个对象就可以获得所有和他有关系的对象,那么这种重用性是非常可观的。 而java是一个面向对象的语言,我们的逻辑是通过java实现的,所以我们的程序更需要依靠java 而数据库只是存储数据的 不应该以数据库为主 应该让代码更加符合面向对象 这样用起来java 才能明白java的美感。 我认为只有考虑到数据库效率的时候写些复杂的sql或者存储过程,其他的能用面向对象的就用面向对象。 毕竟我们玩的是java |
|
返回顶楼 | |
发表时间:2014-03-14
a2349830 写道 我觉得hibernate是非常有必要的
对于现在的数据库而言都是关系型数据库 通过传统的jdbc之类的很难让整个系统都是面向对象。 比如有2个对象 老师 、教导主任 学生 假设一个学生只有一个老师 假设一个老师只有一个教导主任 第一个业务 根据学生id查出学生和老师的名字 sql: select Teacher.name ,Student.name from Teacher join Student on Student.TeacherId = Teacher.id where Student.id = 1 oo: Student.getTeacher().getName(); Student.getName(); 其实还有一个教导主任。 新业务 显示学生 对应 的 教导主任(Headmaster) 我们就只能改sql了 sql: select Teacher.name ,Student.name ,Headmaster name from Teacherjoin Studenton Student.TeacherId = Teacher.id join Headmaster on Headmaster.id = Teacher.HeadmasterId where Student.id = 1 oo: Student.getTeacher().getName; Student.getName(); Student.getTeacher().getHeadmaster().getName() 如果用面向对象的感觉,你不需要改任何sql 而且在jsp中就可以实现,你甚至不用编译代码。 把所有对象的关系确立了通过一个对象就可以获得所有和他有关系的对象,那么这种重用性是非常可观的。 而java是一个面向对象的语言,我们的逻辑是通过java实现的,所以我们的程序更需要依靠java 而数据库只是存储数据的 不应该以数据库为主 应该让代码更加符合面向对象 这样用起来java 才能明白java的美感。 我认为只有考虑到数据库效率的时候写些复杂的sql或者存储过程,其他的能用面向对象的就用面向对象。 毕竟我们玩的是java 我的观点是,面向对象是手段,不是目的。 我们开发程序追求的目标不外乎是几个:高性能,高可维护性,高可扩展性,高可用性, 高开发效率。也许有漏掉的方面,大体就这个意思了。 面向对象作为手段,它的意义,我的理解,是对开发效率,可扩展性,可维护性方面有巨大的帮助。 对高性能和高可用没有直接影响。 hibernate能提高哪个方面?最有可能的是高开发效率, 高可维护性吧。 我未能体会到它在这两个方面带来的好处。 如果不能切实的体会到其好处,我们不能为了面向对象而面向对象。 |
|
返回顶楼 | |
发表时间:2014-03-18
ThinkingQuest 写道 a2349830 写道 我觉得hibernate是非常有必要的
对于现在的数据库而言都是关系型数据库 通过传统的jdbc之类的很难让整个系统都是面向对象。 比如有2个对象 老师 、教导主任 学生 假设一个学生只有一个老师 假设一个老师只有一个教导主任 第一个业务 根据学生id查出学生和老师的名字 sql: select Teacher.name ,Student.name from Teacher join Student on Student.TeacherId = Teacher.id where Student.id = 1 oo: Student.getTeacher().getName(); Student.getName(); 其实还有一个教导主任。 新业务 显示学生 对应 的 教导主任(Headmaster) 我们就只能改sql了 sql: select Teacher.name ,Student.name ,Headmaster name from Teacherjoin Studenton Student.TeacherId = Teacher.id join Headmaster on Headmaster.id = Teacher.HeadmasterId where Student.id = 1 oo: Student.getTeacher().getName; Student.getName(); Student.getTeacher().getHeadmaster().getName() 如果用面向对象的感觉,你不需要改任何sql 而且在jsp中就可以实现,你甚至不用编译代码。 把所有对象的关系确立了通过一个对象就可以获得所有和他有关系的对象,那么这种重用性是非常可观的。 而java是一个面向对象的语言,我们的逻辑是通过java实现的,所以我们的程序更需要依靠java 而数据库只是存储数据的 不应该以数据库为主 应该让代码更加符合面向对象 这样用起来java 才能明白java的美感。 我认为只有考虑到数据库效率的时候写些复杂的sql或者存储过程,其他的能用面向对象的就用面向对象。 毕竟我们玩的是java 我的观点是,面向对象是手段,不是目的。 我们开发程序追求的目标不外乎是几个:高性能,高可维护性,高可扩展性,高可用性, 高开发效率。也许有漏掉的方面,大体就这个意思了。 面向对象作为手段,它的意义,我的理解,是对开发效率,可扩展性,可维护性方面有巨大的帮助。 对高性能和高可用没有直接影响。 hibernate能提高哪个方面?最有可能的是高开发效率, 高可维护性吧。 我未能体会到它在这两个方面带来的好处。 如果不能切实的体会到其好处,我们不能为了面向对象而面向对象。 除了高性能,其他都okay。正如前面老兄说的。性能问题,需要自己对hibernate够熟(会用)。 |
|
返回顶楼 | |
发表时间:2014-03-18
ThinkingQuest 写道 a2349830 写道 我觉得hibernate是非常有必要的
对于现在的数据库而言都是关系型数据库 通过传统的jdbc之类的很难让整个系统都是面向对象。 比如有2个对象 老师 、教导主任 学生 假设一个学生只有一个老师 假设一个老师只有一个教导主任 第一个业务 根据学生id查出学生和老师的名字 sql: select Teacher.name ,Student.name from Teacher join Student on Student.TeacherId = Teacher.id where Student.id = 1 oo: Student.getTeacher().getName(); Student.getName(); 其实还有一个教导主任。 新业务 显示学生 对应 的 教导主任(Headmaster) 我们就只能改sql了 sql: select Teacher.name ,Student.name ,Headmaster name from Teacherjoin Studenton Student.TeacherId = Teacher.id join Headmaster on Headmaster.id = Teacher.HeadmasterId where Student.id = 1 oo: Student.getTeacher().getName; Student.getName(); Student.getTeacher().getHeadmaster().getName() 如果用面向对象的感觉,你不需要改任何sql 而且在jsp中就可以实现,你甚至不用编译代码。 把所有对象的关系确立了通过一个对象就可以获得所有和他有关系的对象,那么这种重用性是非常可观的。 而java是一个面向对象的语言,我们的逻辑是通过java实现的,所以我们的程序更需要依靠java 而数据库只是存储数据的 不应该以数据库为主 应该让代码更加符合面向对象 这样用起来java 才能明白java的美感。 我认为只有考虑到数据库效率的时候写些复杂的sql或者存储过程,其他的能用面向对象的就用面向对象。 毕竟我们玩的是java 我的观点是,面向对象是手段,不是目的。 我们开发程序追求的目标不外乎是几个:高性能,高可维护性,高可扩展性,高可用性, 高开发效率。也许有漏掉的方面,大体就这个意思了。 面向对象作为手段,它的意义,我的理解,是对开发效率,可扩展性,可维护性方面有巨大的帮助。 对高性能和高可用没有直接影响。 hibernate能提高哪个方面?最有可能的是高开发效率, 高可维护性吧。 我未能体会到它在这两个方面带来的好处。 如果不能切实的体会到其好处,我们不能为了面向对象而面向对象。 谢谢,你给出了答案。也就是说,有时候暂时可能用处不大。但是长期考虑,还是有必要的。 |
|
返回顶楼 | |
发表时间:2014-03-18
a2349830 写道 我觉得hibernate是非常有必要的
对于现在的数据库而言都是关系型数据库 通过传统的jdbc之类的很难让整个系统都是面向对象。 比如有2个对象 老师 、教导主任 学生 假设一个学生只有一个老师 假设一个老师只有一个教导主任 第一个业务 根据学生id查出学生和老师的名字 sql: select Teacher.name ,Student.name from Teacher join Student on Student.TeacherId = Teacher.id where Student.id = 1 oo: Student.getTeacher().getName(); Student.getName(); 其实还有一个教导主任。 新业务 显示学生 对应 的 教导主任(Headmaster) 我们就只能改sql了 sql: select Teacher.name ,Student.name ,Headmaster name from Teacherjoin Studenton Student.TeacherId = Teacher.id join Headmaster on Headmaster.id = Teacher.HeadmasterId where Student.id = 1 oo: Student.getTeacher().getName; Student.getName(); Student.getTeacher().getHeadmaster().getName() 如果用面向对象的感觉,你不需要改任何sql 而且在jsp中就可以实现,你甚至不用编译代码。 把所有对象的关系确立了通过一个对象就可以获得所有和他有关系的对象,那么这种重用性是非常可观的。 而java是一个面向对象的语言,我们的逻辑是通过java实现的,所以我们的程序更需要依靠java 而数据库只是存储数据的 不应该以数据库为主 应该让代码更加符合面向对象 这样用起来java 才能明白java的美感。 我认为只有考虑到数据库效率的时候写些复杂的sql或者存储过程,其他的能用面向对象的就用面向对象。 毕竟我们玩的是java 还需要说的一点。我之前说不用级联,不是说不用hibernate。用hibernate,只是不用级联。 对象管理查找,通过dao去再操作。 |
|
返回顶楼 | |