web-dev-qa-db-ja.com

休止状態とiBATIS

新製品のリエンジニアリングでは、Javaから最適なフレームワークを選択する過程にあります。モデルのデータベースに依存しないアプローチを検討することが検討されているため、Struts + SpringとiBATISまたはHibernateの間のオプションに取り組んでいます。どちらも永続性を提供するため、最適なアドバイスをお願いします。

72
user241394

イバティスとハイバネートは全く異なる獣です。

私がそれを見る傾向があるのはこれです:ビューがより多くの場合、Hibernateはより良く動作しますobject-centric。ただし、より多くのビューを表示する場合は、データベース中心の場合、Ibatisの方がはるかに強力です。

スキーマを完全に制御しており、スループット要件が非常に高くない場合、Hibernateは非常にうまく機能します。オブジェクトモデルはかなり便利なコードを作成しますが、巨大複雑さのコストがかかります。

かなり複雑なSQLクエリを記述する必要がある「レガシー」データベーススキーマを扱っている場合は、Ibatisがより適切に機能する可能性があります。

HQL(Hibernate Query Language)は、学習する必要がある別の言語であり、その場合でもstill SQLを記述する必要がある場合があります。さらに、Hibernateでパフォーマンスの高いSQLクエリを生成するために、XML、プロパティ、注釈などの適切な組み合わせを見つけるのに半日費やす可能性があります。

この質問に対する普遍的な「AはBより良い」という答えはありません。

180
cletus

あなたが達成しようとしていることを考慮してください。通常、 Command Query Response Segregation モデルは、複雑なドメインに適しています。

その理由は、通常、次の2つのいずれかを実行しようとしているためです。

  1. いくつかの複雑なドメインエンティティの作成/更新/削除
  2. 分析フェッチクエリ(つまり、集計/集計クエリ)を実行する

Hibernateは、ケース1でうまく機能し、POJOを作成して永続化/更新することができます。ドメインが非常に大きい場合を除き、これも迅速に行われます。

myBatisは、単に答えが必要なクエリ(ケース2)のフェッチに最適です。 Hibernateはオブジェクトグラフ全体をロードしようとするため、LazyLoadingトリックを使用してクエリをチューニングし、大規模なドメインで動作を維持する必要があります。逆に、分析POJOページだけが必要な場合、同じクエリのmyBatis実装は簡単です。

このため、SELECTでmyBatis Hibernateより高速 です。

これら2つのケースは、ドメインデータを変更するCommandsResponsesデータを取得するだけの場所。

したがって、これら2つのケースと、アプリケーションが何をするかを検討してください。単純なドメインがあり、情報を取得するだけの場合は、myBatisを使用します。複雑なドメインがあり、エンティティを永続化する場合は、Hibernateを使用します。両方を行う場合は、ハイブリッドアプローチを検討してください。それは私たちがコントロール下に保つために何千ものエンティティを持つプロジェクトで使用するものです。 ;)

45
Joseph Lust

クレタスは、この比較を要約するのに素晴らしい仕事をしました。 Hibernateは、データモデルを制御するとうまく機能し、オブジェクト中心になりますが、iBATISは、既存のデータベースと統合する必要があり、データ中心になります。

また、Hibernateにはもう少し学習曲線があると思います。 iBATISを使用すると、Hibernateでさらに「魔法」が発生する一方で、何が起こっているのかを知るのは非常に簡単です。言い換えれば、初心者はiBatisを使いやすく理解しやすいと感じるかもしれません。

しかし、iBatisを好むべきだと言っているわけではありません。iBatisとHibernateは、上記のように異なるだけです。

ところで、Hibernateを使用する場合は、 Hibernate Annotations で提供される標準化されたJPAおよびEJB 3.0(JSR-220)オブジェクト/リレーショナルマッピングアノテーションの使用を検討してください。

18
Pascal Thivent

ORM vs永続化フレームワーク

Hibernateは、Javaクラスをデータベーステーブルにマッピングするオブジェクト関係マッピングフレームワーク(ORM)です。MyBatisは、ORMではなく永続フレームワークです。SQLステートメントをJavaメソッド。

データベーススキーマ

Hibernateは、Javaモデルに従ってデータベーススキーマを作成または検証できますが、MyBatisにはこのような機能はありません。また、インメモリDBを使用している場合の環境のテストに便利です。

キャッシュ

Hibernateには、無効にすることが不可能な一次キャッシュがあります。つまり、ORMを介してアイテムを照会し、SQLで直接削除すると、キャッシュに残ります。キャッシュを明示的にクリアして、データベースから最新の結果を取得できます。関連する議論:

楽観的ロック管理

また、楽観的ロック管理には違いがあります。

MyBatisは、@ Versionアノテーションを持つHibernate/JPAなどのORMツールとは異なり、オプティミスティックな同時実行制御をネイティブでサポートしていません。

関連する議論:

遅延読み込み

Hibernateは、遅延読み込みとしてマークされているオブジェクトを除くオブジェクトグラフ全体を読み込みます。 myBatisは、SQLクエリに従ってデータをロードします。遅延読み込みはパフォーマンスを向上させる可能性がありますが、<property name="hibernate.enable_lazy_load_no_trans" value="true" />プロパティと共に使用すると接続リークが発生する可能性があります。関連する議論:

Hibernate Session management

保存、更新、削除などのエンティティ操作は、Hibernate Session を介して実行されます。 detached entity passed to persistおよびHibernateに関連する他の現象を回避するために、適切なHibernateセッション管理戦略を実装する方法を十分に理解する必要があります。

基礎となるHibernateの動作を理解しようとすると、もう少し作業を追加してmyBatisの生のSQLステートメントを記述するよりも時間がかかる場合があります。

カスケード

Hibernateは、myBatisに存在しないオブジェクトグラフのカスケード、孤立削除、およびその他の機能を提供します-それらを実装するには、SQLクエリを明示的に記述する必要があります。

クエリ

MyBatisでは、ほとんどプレーンなSQLクエリを記述します。 Hibernateには、クエリを形成するための複数のオプションがあります:SQL、HQL、Criteria API。条件に多くのオプションフィールドがある場合、Criteria APIを使用することが適切な場合があります。クエリを形成するためのより構造化されたアプローチを提供し、関連する間違いを避けることができます。

15
Justas

HibernateはORMです。つまり、(最も基本的なレベルで)Javaオブジェクトのインスタンスをデータベーステーブル内の実際の行にマップします。データベースにpojoが表示され、Hibernateは適切なタイミングで関連するSQLを生成して実行します。

Mybatis(最も基本的なレベル)は、XMLファイルに保存されているSQLをつなぎ合わせて実行するための単なるツールです。 Javaオブジェクトのインスタンスをデータベーステーブルの行にマッピングするのではなく、JavaメソッドをSQLステートメントにマッピングするため、ORMではありません。もちろん、pojoを返すこともできますが、どのような永続コンテキストにも結び付けられていません。

どちらのツールも上記で説明した以上の機能を備えていますが、1つはORMで、もう1つはそうではありません。

使用するものを選択できるようにするための基準は、使用しなければならないデータベースモデルに大きく依存していると思います。

たとえば、ある保険モデルを表す大規模な広大なスキーマを想像してください。開発者は、データを取得し、手元のビジネスに合った方法でそのデータと対話する必要があります。

開発者は外に出て、手作業でall sql(Mybatisが必要とする)を書くために必要なビジネス知識を持つことは決して期待されません。 Hibernateはそのようなシナリオに適しています。

ビジネスアナリストは、専門知識と同様に、データモデル、エンティティ、関係、および相互作用を定義します。 Javaその後、開発者はHibernateを使用して「モデルをウォーク」します。ビジネス開発者は、非常に複雑なスキーマで実行する複雑なエラーを起こしやすいSQLを記述することなく、非常に生産的になります。

私の経験では、HibernateとMybatisの両方が同じプロジェクトで定期的に使用されています。

Hibernateが使用されている場所

  • 一般的なC.R.U.D機能
  • 「ドメインオブジェクト」リレーショナルモデルを「歩く」
  • セッション管理

mybatisが使用されている場所

  • アドホッククエリ
  • ストアドプロシージャを開始(および対話)する
  • 非常に具体的または複雑なクエリをサポートする
  • 検索条件が動的である複雑な検索クエリ、および結果のページングをサポートする
7
johnm

既にSpringを使用している場合は、HibernateまたはiBatisに飛び込むのではなく、Spring JDBCから始めます。インターフェースの観点から永続層を作成する場合、HibernateまたはiBatisを取得してから実装を切り替えるのに問題はないはずです。

「すべてまたはなし」の決定でなければならない理由はありません。あなたの状況に最適なものを使用してください。

6
duffymo