73 java persistence frameworks hibernate ibatis
对于我们的新产品重新设计,我们正在从Java中选择最佳框架.考虑到模型的数据库不可知方法,我们正在研究Struts + Spring与iBATIS或Hibernate之间的选择.请提供最好的建议,因为两者都提供持久性.
cle*_*tus 180
Ibatis和Hibernate是完全不同的野兽.
我倾向于看待它的方式是:如果您的视图更加以对象为中心, Hibernate的效果会更好.但是,如果您认为更加以数据库为中心,那么Ibatis是一个更强大的选择.
如果您完全控制了架构并且没有极高的吞吐量要求,那么Hibernate可以很好地工作.对象模型使得用于还算方便代码,但在巨大的复杂性成本.
如果您正在处理需要编写相当复杂的SQL查询的"遗留"数据库模式,那么Ibatis可能会更好地工作.
HQL(Hibernate查询语言)是您必须学习的另一种语言,即使这样您也可能会发现仍需要编写SQL的情况.更重要的是,你可能会花一半时间找出XML,属性,注释等的正确组合,以使Hibernate生成一个高性能的SQL查询.
这个问题没有普遍的"A比B好"的答案.
Jos*_*ust 45
考虑一下你想要实现的目标.通常,命令查询响应隔离 模型适用于复杂域.
原因是你试图通常做两件事之一:
Hibernate适用于案例1,允许您创建POJO并持久/更新它.它也可以快速完成,除非您的域名非常大.
myBatis非常适合于您只想要答案的获取查询(案例2).Hibernate将尝试加载整个对象图,您需要使用LazyLoading技巧开始调优查询,以使其在大型域上运行.相反,如果您只是想要一些分析POJO页面,那么相同查询的myBatis实现将是微不足道的.
因此,myBatis 比 SELECTS的Hibernate更快.
这两种情况的区别命令要更改域数据和反应,你只是想获取一些数据.
因此,请考虑这两种情况以及您的应用程序的作用.如果您有一个简单的域并且只是获取信息,请使用myBatis.如果您有一个复杂的域并持久化实体,请使用Hibernate.如果两者兼顾,请考虑采用混合方法.这就是我们在项目中使用的,它拥有数千个实体来控制它.;)
Pas*_*ent 18
Cletus在总结这一比较方面做得很好.当您控制数据模型时,Hibernate运行良好,并且更加以对象为中心,而当您需要与现有数据库集成并且更加以数据为中心时,iBATIS可以正常工作.
另外我认为Hibernate有更多的学习曲线.使用iBATIS,很容易知道正在发生什么,而Hibernate会发生更多"魔术".换句话说,新手可能会发现iBatis更易于使用和理解.
但我不是说你应该更喜欢iBatis,iBatis和Hibernate就像上面说的那样不同.
顺便说一下,如果你选择Hibernate,可以考虑使用Hibernate Annotations提供的标准化JPA和EJB 3.0(JSR-220)对象/关系映射注释.
Jus*_*tas 15
ORM与持久性框架
Hibernate是对象关系映射框架(ORM),它将Java类映射到数据库表.MyBatis是持久性框架 - 而不是ORM.它将SQL语句映射到Java方法.
数据库架构
Hibernate可以根据您的Java模型创建或验证数据库模式,而MyBatis没有此类功能.当您使用内存数据库时,它也便于测试环境.相关讨论:
高速缓存
Hibernate具有一级缓存,无法禁用.这意味着如果您通过ORM查询项目然后直接使用SQL删除它,它将保留在缓存中.您可以显式清除缓存以从数据库中获取最新的结果.相关讨论:
乐观的锁管理
乐观锁管理也存在差异:
MyBatis本身不支持乐观并发控制,不像Hibernate/JPA这样的ORM工具和@Version注释.
相关讨论:
懒加载
Hibernate将尝试加载整个对象图,除了标记为延迟加载的对象.myBatis将根据SQL查询加载数据.延迟加载可能会提高性能,但如果与<property name="hibernate.enable_lazy_load_no_trans" value="true" />
属性一起使用,可能会导致连接泄漏
.相关讨论:
Hibernate会话管理
保存,更新或删除等实体操作是通过Hibernate Session执行的.它需要很好地理解如何实现适当的Hibernate会话管理策略以避免detached entity passed to persist
与Hibernate相关的其他现象.
有时,尝试理解底层Hibernate行为可能需要花费更多时间,而不是为myBatis添加更多工作和编写原始SQL语句.
级联
Hibernate为对象图提供了级联,孤立删除和其他功能,而它们不在myBatis中 - 为了实现它们,您需要明确地编写SQL查询.
查询
在myBatis中,您将编写几乎简单的SQL查询.Hibernate有多种形式的查询选项:SQL,HQL,Criteria API.有时,如果条件中有许多可选字段,则可能适合使用Criteria API.它将提供更加结构化的方法来形成查询,并可能避免相关的错误.
Hibernate是一个ORM,意思是(在最基本的层面)它将java对象的实例映射到数据库表中的实际行.通常,对于通过Hibernate检索的pojo:对这些pojo的任何操作和修改都将出现在数据库中.Hibernate将在适当的时候生成并执行相关的SQL.
Mybatis(最基本的级别)只是拼凑和执行存储在xml文件中的SQL的工具.它不会将Java对象的实例映射到数据库表中的行,而是将Java方法映射到SQL语句,因此它不是ORM.它当然也可以返回pojo,但它们并不依赖于任何类型的持久化上下文.
这两个工具比上面描述的要多得多,但一个是ORM,一个不是.
我相信,让您选择使用哪个标准的标准主要取决于您必须使用的数据库模型.
例如,想象一个庞大的蔓延模式,代表一些保险模型.开发人员需要检索数据,并以满足手头业务的方式与数据交互.
开发人员继续前进,并且永远不会期望拥有必要的业务知识来 手工编写所有 sql(Mybatis需要).Hibernate会适合这样的场景.
业务分析师定义数据模型,实体,关系和交互,以及他们的专业知识.然后,Java开发人员使用Hibernate来"走模型".业务开发人员可以快速提高工作效率,而无需编写复杂的容易出错的SQL来在非常复杂的模式上运行.
在我的expierence中,Hibernate和Mybatis都在同一个项目中定期使用.
使用Hibernate的地方
以及Mybatis的使用地点
如果您已经在使用Spring,我将从Spring JDBC开始,而不是直接进入Hibernate或iBatis.如果你根据接口编写持久层,那么在你熟悉Hibernate或iBatis之后,切换实现应该没有问题.
没有理由为什么它必须是"全有或全无"的决定.使用最适合您情况的东西.
归档时间: |
|
查看次数: |
83844 次 |
最近记录: |