Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
陷阱和实际用例:Toplink、Hibernate、Eclipse链接、Ibatis_Hibernate_Jpa_Ibatis_Eclipselink_Toplink - Fatal编程技术网

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

陷阱和实际用例:Toplink、Hibernate、Eclipse链接、Ibatis,hibernate,jpa,ibatis,eclipselink,toplink,Hibernate,Jpa,Ibatis,Eclipselink,Toplink,我经常使用Hibernate作为我的JPA实现。在大多数情况下,它工作良好!但我也看到了很多陷阱: 远程处理持久化对象很困难,因为Hibernate用自己的集合实现替换Java集合。因此,每个客户机都必须有Hibernate.jar库。您必须注意懒散加载异常等问题。解决此问题的一种方法是使用Web服务 脏检查是在没有任何锁的情况下对数据库执行的 “延迟SQL”,导致数据访问不符合ACID。(丢失的数据…) 隐式更新>>所以我们不知道对象是否被修改(提交导致更新) Toplink、Eclips

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

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

Toplink、Eclipse Link和Ibatis是否存在类似的问题?我应该什么时候使用它们?他们有类似的表演吗?有没有理由选择Eclipse链接/Toplink。。。冬眠

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

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


    --安迪

    我可以分享我的大量冬眠陷阱:

    • 标准API不是类型安全的
    • Criteria API的设计相对较差(例如:无法检索当前别名)
    • 如果创建别名,则是在强制内部联接(这在文档中,但具有误导性)
    • 不支持工会
    • 无法轻松地“取消代理”持久对象(第三方支持远程处理)
    • 不支持不带PKs的表(我现在认为它是哑的,但它发生在遗留模式中)
    • 对于非PK列,没有简单的方法使用序列(不是那么愚蠢)
    对于大多数JPA实现,我总是发现我必须依赖一些自定义注释来完成JPA规范中没有涉及的事情

    有没有理由选择Eclipse 链接/顶部链接。。。冬眠

    在O/R mapper developer land(我住的地方)中,Toplink被认为是功能最完整、最好的O/R mapper,这是一个普遍的事实。它有它的弱点,但它的大量功能使它成为一个难以击败的东西。由于它现在是开源和免费的,我想尝试一下

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

    关于Ebean ORM和您的陷阱:

    远程处理

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

    对数据库执行脏检查时不带任何锁

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

    延迟SQL

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

    隐式更新


    我们经常听到前Hibernate和前JPA员工的抱怨。Ebean的体系结构没有会话/实体管理器。相反,您需要显式地保存()一个bean,或者将该bean级联到相关的bean。因此,是的,没有Ebean的隐式更新

    “不支持具有可空列的组合键(我现在认为这很愚蠢,但它发生在传统模式中)”你是说,我按的是外键?因为PK字段不能为空(因为只有字段的组合是唯一的),所以您是对的。我有一个没有PK的表,我尝试对PK使用唯一约束。Hibernate不会对数据库进行脏检查。实体在setter访问后被标记为dirty,Hibernate还会与修改前获取的实体快照进行逐字段比较。