陷阱和实践案例:Toplink、Hibernate、Eclipse Link、Ibatis

3

我在JPA实现中大量使用了Hibernate。在大多数情况下它都能正常工作!但我也看到了很多陷阱:

  • 使用持久化对象进行远程访问很困难,因为Hibernate会用自己的集合实现替换Java集合。所以每个客户端都必须有Hibernate .jar库。您必须注意LazyLoading异常等问题。解决此问题的一种方法是使用Web服务。
  • 脏检查是针对数据库而不是锁定完成的。
  • "延迟SQL"导致数据访问不符合ACID标准。(丢失数据...)
  • 隐式更新 >> 因此我们不知道对象是否已被修改(提交会导致更新)。

Toplink、Eclipse Link和Ibatis是否存在类似的问题?何时应该使用它们?它们的性能是否相似?选择Eclipse Link/Toplink...而不是Hibernate是否有理由?


Hibernate不会对数据库进行脏检查。在setter访问后,实体被标记为脏数据,并且Hibernate还会针对修改前的实体快照进行逐个字段的比较。 - Pascal Thivent
4个回答

5
我可以分享一些Hibernate的陷阱:
  • Criteria API不是类型安全的
  • Criteria API设计相对较差(例如:您无法检索当前别名)
  • 如果创建一个别名,您将强制使用内部连接(这在文档中但会误导您)
  • 不支持UNIONs
  • 没有简单的方法来“解除代理”持久对象(远程处理由第三方支持)
  • 不支持没有主键的表(我知道这很愚蠢,但在旧版模式中确实会发生)
  • 没有简单的方法为非主键列使用序列(并不那么愚蠢)
至于大多数JPA实现,我总是发现我必须依赖一些自定义注释或其他东西来做一些JPA规范未覆盖的事情。

不支持具有可空列的复合键(我知道这很愚蠢,但在传统模式中确实会发生)你是指外键吧?因为PK字段不能为null(因为只有字段的组合是唯一的)。 - Frans Bouma
你说得对。我有一个没有主键的表,然后我尝试使用唯一约束来作为主键。 - Miguel Ping

2
有没有选择Eclipse Link/Toplink...而不是Hibernate的理由?
在O/R映射器开发者的世界(我所在的领域;)),Toplink被认为是最全面和最好的O/R映射器。它有它的弱点,但其大量的特性使它成为难以超越的东西。现在它是开源和免费的,我建议你试试。
iBatis并不是真正的O/R映射器,它更像是通过硬编码SQL进行类填充/持久化。因此,您需要自己完成大部分工作并编写所有查询。当您使用带有存储过程的数据库并必须利用这些过程进行DML / set检索时,iBatis非常有用。

1
关于Ebean ORM http://www.avaje.org和你可能遇到的问题: 远程调用 您可以在查询中使用“vanilla”模式,然后Ebean将返回普通的bean和集合。这仅适用于使用“动态代理/动态子类”,而不适用于使用增强(因为实体bean类显然已经增强)。 脏数据检查是针对数据库进行的,没有任何锁定
我认为您指的是乐观并发检查?如果是这样,那么根据定义,它是在没有显式DB锁定的情况下完成的。如果您想要/需要DB锁定(例如select for update等),则需要使用悲观锁定。因此,我不明白您的观点。 延迟SQL Ebean没有会话,因此没有会话flush()。当您使用JDBC批处理时,SQL仍然可以被延迟,但这与会话flush()得到的延迟不同。 隐式更新 我们经常听到来自前Hibernate和JPA用户的抱怨。Ebean的架构没有session/entityManager,相反,您需要显式地保存()一个bean或者让它级联到相关的beans。所以是的,Ebean没有隐式更新。

1

不能评论其他实现,但对于DataNucleus AccessPlatform ...

  1. 远程调用可能需要存在“jdo.jar”,因为模型类是通过字节码增强实现的。或者如果在远程端只使用“只读”时,则在那里使用未增强的类,所有功能都可以正常运行,无需使用额外的 jar。
  2. 脏检查是通过字节码增强来完成的,因此无需访问数据存储区以查看字段是否脏(并且您可以在想要访问数据存储区时控制锁定)。显然,这比基于反射的实现提供了重大的性能优势。
  3. 我不知道可能发生“丢失更新”的情况;使用乐观锁定有助于防止这种情况。
  4. 由于“托管关系”(其中您具有双向关系,并且只更改其中一侧,因此DataNucleus会更新另一侧以保持一致...刷新()),您可能会获得隐式更新。您可以关闭“托管关系”(到一定程度)。您可以轻松启用对象版本控制,并知道对象是否已修改。

选择DataNucleus的原因在此处记录

希望对你有所帮助

--Andy DataNucleus

--安迪 DataNucleus


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接