陷阱和实际用例:Toplink、Hibernate、Eclipse Link、Ibatis

发布于 2024-07-16 15:21:11 字数 472 浏览 7 评论 0原文

我经常使用 Hibernate 作为我的 JPA 实现。 大多数情况下它工作得很好! 但我也看到了很多陷阱:

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

Toplink、Eclipse Link 和 Ibatis 是否也存在类似问题? 我什么时候应该使用它们? 他们有类似的表现吗? 是否有理由选择 Eclipse Link/Toplink... 而不是 Hibernate?

I worked a lot with Hibernate as my JPA implementation. In most cases it works fine! But I have also seen a lot of pitfalls:

  • Remoting with persisted Objects is difficult, because Hibernate replaces the Java collections with its own collection implementation. So the every client must have the Hibernate .jar libraries. You have to take care on LazyLoading exceptions etc. One way to get around this problem is the use of webservices.
  • Dirty checking is done against the Database without any lock.
  • "Delayed SQL", causes that the data access isn't ACID compliant. (Lost data...)
  • Implict Updates >> So we don't know if an object is modified or not (commit causes updates).

Are there similar issues with Toplink, Eclipse Link and Ibatis? When should I use them? Have they a similar performance? Are there reasons to choose Eclipse Link/Toplink... over Hibernate?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

半城柳色半声笛 2024-07-23 15:21:11

我可以分享我的大量 Hibernate 陷阱:

  • Criteria API 不是类型安全
  • Criteria API 的设计相对较差(例如:您无法检索当前别名)
  • 如果您创建别名,则将强制进行内部联接(这在文档中,但具有误导性)
  • 不支持 UNION
  • 没有简单的方法来“去代理”持久对象(第三方支持远程处理)
  • 不支持没有 PK 的表(我现在这很愚蠢,但它发生在遗留系统中)模式)
  • 没有简单的方法来使用非 PK 列的序列(不是那么愚蠢)

对于大多数 JPA 实现,我总是发现我必须依赖一些自定义注释或类似的东西来完成在JPA 规格

I can share my fair amount of Hibernate pitfalls:

  • Criteria API is not typesafe
  • Criteria API is relatively bad designed (ex: you cannot retrieve the current aliases)
  • If you create an alias, you are forcing a inner join (this is in the docs but is misleading)
  • No support for UNIONs
  • No easy way to 'de-proxy' a persistent object (remoting is supported by third parties)
  • No support for tables without PKs (I now it's dumb but it happens in legacy schemas)
  • No easy way to use sequences for non-PK columns (not so dumb)

As for most JPA implementations, I always found that I'd have to rely on some custom annotations or so to do stuff that it is not covered in the JPA spec.

蹲墙角沉默 2024-07-23 15:21:11

有什么理由选择Eclipse
Link/Toplink...通过 Hibernate?

在 O/R 映射器开发者领域(我居住的地方;)),一个普遍的事实是 Toplink 被认为是功能最完整和最好的 O/R 映射器。 它有其弱点,但其大量的功能使其难以被击败。 由于它现在是开源且免费的,我会尝试一下。

iBatis 并不是真正的 O/R 映射器,它更像是通过硬编码 SQL 进行的类填充/持久化。 因此,您必须完成繁重的工作并编写所有查询。 当您使用带有存储过程的数据库并且必须利用这些过程进行 DML/集检索时,iBatis 非常有用。

Are there reasons to choose Eclipse
Link/Toplink... over Hibernate?

In O/R mapper developer land (where I live ;)) it's a common fact that Toplink is considered to be the most feature complete and best O/R mapper out there. It has its weaknesses, but its vast number of features makes it something that's hard to beat. As it's now open source and free, I'd give it a try.

iBatis is not really an O/R mapper, it is more of a class filler/persister through hard-coded SQL. So you've to do the heavy lifting and have to write all queries. iBatis is useful when you're using a database with stored procs and have to utilize these procs for DML/set retrieval.

自此以后,行同陌路 2024-07-23 15:21:11

无法评论其他实现,但对于 DataNucleus AccessPlatform ...

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

选择 DataNucleus 的原因记录在此处

HTH

--Andy DataNucleus

Can't comment on other implementations but for DataNucleus AccessPlatform ...

  1. Remoting can require "jdo.jar" to be present since the model classes are bytecode enhanced. Alternatively if used "read-only" on the remote side then use un-enhanced classes there and all works without the additional jar.
  2. Dirty checking is done via bytecode enhancement so no need to go to the datastore to see if a field is dirty (and you can have control over locks when you want to go to the datastore). Obviously this gives significant performance advantages over reflection based implementations.
  3. I know of no "lost updates" possible; use of optimistic locking helps.
  4. You can get implicit updates due to "managed relations" (where you have a bidirectional relation and you only change one side, so DataNucleus updates the other side to be consistent ... at flush()). You can turn off "managed relations" (up to a point). You can easily enable versioning of objects and know if an object is modified or not.

Reasons to choose DataNucleus are documented here

HTH

--Andy DataNucleus

檐上三寸雪 2024-07-23 15:21:11

关于 Ebean ORM http://www.avaje.org 和您的陷阱:

远程处理

您可以在查询中使用“vanilla”模式,然后 Ebean 将返回普通 bean 和集合 这仅在您使用“动态代理/动态子类”时有效,但如果您使用增强则无效(因为实体 bean 类明显得到增强)。

脏检查是在没有任何锁定的情况下对数据库进行的

我相信你的意思是乐观并发检查? 如果是这样,那么根据定义,它是在没有显式数据库锁的情况下完成的。 如果您想要/需要数据库锁(选择更新等),您需要使用悲观锁定 - 所以我不遵循您的观点。

延迟SQL

Ebean没有会话,因此它没有会话flush()。 当您使用 JDBC 批处理时,Ebean 仍然可能会延迟 SQL,但这与使用 session flash() 获得的延迟不同。

隐式更新

是我们从前 Hibernate 和前 JPA 人员那里听到的常见抱怨。 Ebean 的架构没有会话/实体管理器。 相反,您需要显式 save() 一个 bean 或将其级联到相关的 bean。 所以是的,Ebean 没有隐式更新。

In regards to Ebean ORM http://www.avaje.org and your Pitfalls:

Remoting

You can use "vanilla" mode on a query and then Ebean will return plain beans and collections. This only works when you use "dynamic proxies/dynamic subclasses" but not if you use Enhancement (as the entity bean classes are obviously enhanced).

Dirty checking is done against the Database without any lock.

I believe you mean Optimistic Concurrency Checking? If so then by definition it is done without an explicit DB lock. You need to use Pessimistic Locking instead if you want/need a DB lock (select for update etc) - so I don't follow your point there.

Delayed SQL

Ebean doesn't have sessions and so it doesn't have session flush(). The SQL can still be delayed with Ebean when you use JDBC batching but it is not the same delay that you get with session flush().

Implicit Updates

A common complaint we hear from ex-Hibernate and ex-JPA folks. Ebean is architected without a session/entityManager. Instead you need to explicitly save() a bean or have that cascade to related beans. So yes, no implicit updates with Ebean.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文