我使用Hibernate作为我的JPA实现工作了很多。在大多数情况下,它工作正常!但我也看到了很多陷阱:
Toplink,Eclipse Link和Ibatis是否存在类似问题?我应该什么时候使用它们?他们有类似的表现吗?是否有理由选择Eclipse Link / Toplink ...而不是Hibernate?
答案 0 :(得分:5)
我可以分享我相当多的Hibernate陷阱:
对于大多数JPA实现,我总是发现我必须依赖一些自定义注释,或者做一些JPA规范中没有涉及的内容。
答案 1 :(得分:2)
是否有理由选择Eclipse Link / Toplink ...通过Hibernate?
在O / R mapper开发者的土地上(我住的地方;))这是一个常见的事实,Toplink被认为是功能最齐全,性能最好的O / R映射器。它有它的弱点,但它的大量功能使它成为难以击败的东西。因为它现在是开源和免费的,我会试一试。
iBatis实际上不是一个O / R映射器,它更像是通过硬编码SQL的类填充/持久化。所以你要做繁重的工作并且必须编写所有查询。当您使用具有存储过程的数据库并且必须利用这些过程进行DML /集检索时,iBatis非常有用。
答案 2 :(得分:1)
无法评论其他实现,但对于DataNucleus AccessPlatform ...
选择DataNucleus的原因是documented here
HTH
- 安迪DataNucleus
答案 3 :(得分:1)
关于Ebean ORM http://www.avaje.org和你的陷阱:
<强>远程处理强>
您可以在查询中使用“vanilla”模式,然后Ebean将返回纯bean和集合。这仅在您使用“动态代理/动态子类”时有效,但在使用增强功能时则无效(因为实体bean类明显增强)。
对数据库进行脏检查,没有任何锁定。
我相信你的意思是乐观并发检查?如果是这样,那么根据定义,它没有显式DB锁。如果你想要/需要数据库锁定(选择更新等),你需要使用悲观锁定 - 所以我不指望你的观点。
延迟SQL
Ebean没有会话,因此它没有会话flush()。使用JDBC批处理时,SQL仍然可以使用Ebean延迟,但它与session flush()的延迟不同。
隐式更新
我们从前Hibernate和前JPA人员那里听到的常见抱怨。 Ebean的架构没有session / entityManager。相反,您需要显式保存()一个bean或将该级联连接到相关的bean。所以是的,没有Ebean的隐式更新。