質問

私の開発者たちは内戦を繰り広げています。あるキャンプでは、Hibernate と Spring を採用しました。もう一方の陣営では、フレームワークを非難していますが、Hibernate を検討しています。

質問は:Hibernate-Spring への初心者の変換者がつまずきそうな、厄介な驚き、弱点、落とし穴はありますか?


追伸:あまり洗練されていない DAO ライブラリがあります。Hibernate のような豊かさがあるとは思えませんが、ある種の成熟に達しつつあります (つまり、含まれている最近のいくつかのプロジェクトでは変更されていません)。

役に立ちましたか?

解決

過去に何度か Hibernate を使用しました。そのたびに、構文の決定がドキュメント、Google、古いバージョンを調べて調べることになるという特殊なケースに遭遇しました。これは強力なツールですが、文書化が不十分です(最後に調べました)。

Spring に関して言えば、過去数年間に私が面接したり調べたりしたほぼすべての仕事に Spring が関係しており、Spring は実際に Java/Web の事実上の標準になりました。これを使用すると、開発者の将来の市場性が高まり、アプリケーションを理解する多くの人々を獲得できるため、あなたにとっても役立ちます。

独自のフレームワークを作成することは魅力的で、勉強になり、楽しいものです。結果はそれほど良くありません。

他のヒント

彼らは非難した フレームワーク?

それはおかしい。既製のフレームワークを使用しない場合は、独自のフレームワークを作成します。それはまだ枠組みです。

確かに Hibernate には癖がありますが、それは Hibernate が解決しようとしている問題が複雑だからです。誰かが Hibernate について文句を言うたびに、私は彼らに、Hibernate を使用していなければ保守しなければならない退屈な DAO コードのことを思い出させます。

いくつかのヒント:

  • Hibernate は、優れたデータベース設計の代わりにはなりません。Hibernate スキーマは問題ありませんが、時々調整する必要があります
  • 最終的には、Hibernate がクラスを遅延ロードする方法と、それが物事にどのような影響を与えるかを理解する必要があります。Hibernate は Java バイトコードを変更するため、オブジェクト リンクが null である理由を説明するだけでも、遅かれ早かれ詳しく調べる必要があります。
  • 可能であれば注釈を使用してください。
  • 時間をかけて Hibernate のパフォーマンス チューニング テクニックを学習すると、長期的には節約になります。

かなり複雑なデータベースがある場合、Hibernate は適さない可能性があります。職場では、大量のデータを含むかなり複雑なデータベースを使用していますが、Hibernate は実際には機能しません。代わりに iBATIS の使用を開始しました。ただし、私は Hibernate をうまく使用している開発ショップをたくさん知っています。Hibernate は多くの面倒な作業を代わりに行ってくれます。そのため、検討する価値はあります。

Spring は、適切な使用方法を知っていれば、優れたツールです。

フレームワークは間違いなく良いものだと私は言います。他の人が指摘したように、車輪を再発明する必要はありません。Spring には多くのモジュールが含まれているため、それほど多くのコードを記述する必要はありません。「ここでは発明されていない」症候群に屈しないでください。

遅延読み込みは、永続化フレームワークに Hibernate を使用する MVC アプリケーションの大きな問題です。オブジェクトをコントローラーにロードし、それを JSP ビューに渡します。クラスのメンバーの一部またはすべてがプロキシされ、コントローラーの完了時に Hibernate セッションが閉じられたため、すべてが爆発します。

を読む必要があります。 ビューでセッションを開く 問題を理解し、解決策を得るには、この記事を参照してください。Springを使用している場合はこれ ブログ記事 ビューで開いているセッションの問題に対する Spring の解決策について説明します。

これは、私が冬眠時代に陥った(覚えている限り)ことの 1 つです。(親エンティティ内の) コレクションから (複数の) 子オブジェクトを削除し、途中でフラッシュせずに 1 つのトランザクションで同じコレクションに新しいエンティティを追加すると、Hibernate は「削除」の前に「挿入」を実行します。子テーブルの列の 1 つに一意制約があり、(私がそうであったように) 以前に一部のデータをすでに削除しているため、その制約に違反しないと予想している場合は、イライラする準備をしてください。Hibernate フォーラムでは次のように提案されています。

  1. それは DB の設計上の欠陥であり、再設計でした。
  2. 削除と挿入の間でフラッシュ (または必要に応じてコミット) します。

両方を行うことはできず、結局 Hibernate ソースを調整して再コンパイルすることになりました。たったの1行のコードでした。しかし、1 行を見つけるまでの労力は、約 27 杯のコーヒーと 3 眠れない夜に相当します。

これは、チームに本当の専門家がいない状態で Hibernate を使用する場合に発生する可能性のある問題や癖の一例にすぎません (専門家:Hibernate の哲学と内部動作について十分な知識を持つ人)。あなたの問題、解決策、コーヒーのリットル、眠れない夜の数は異なる場合があります。しかし、あなたはその考えを理解しています。

私は Java であまり働いたことはありませんが、Java 開発者の大規模なグループで働いたことはあります。春は大丈夫、という印象でした。しかし、誰もが Hibernate に腹を立てていました。チームの半分は、「一つのことを変えることができれば、何を変えますか?」と尋ねられた場合、チームの半分。そして、彼らは「冬眠を取り除く」と言うでしょう。Hibernate を学び始めたとき、驚くほど複雑であることに衝撃を受けましたが、その複雑さが正当であるかどうかを知るには十分な学習ができませんでした (おそらく、いくつかの複雑な問題を解決する必要があるのでしょう)。

チームは Spring を排除して Guice を採用しましたが、少なくとも私やこれまで話した他の開発者の観点からすると、それは政治的変化のようなものでした。

Hibernate は少し複雑で、習得するのが難しいといつも感じてきました。しかし、として JPA (Java Persistence API) および EJB (Enterprise Java Beans) 3.0 はしばらく前から存在していて、物事がはるかに簡単になりました。私はクラスに注釈を付けて、JavaDoc または XML 経由でマッピングを作成することを好みます。をチェックしてください Hibernate でのサポート. 。さらに、必要に応じて後でデータベース フレームワークを変更できる (ただし、簡単ではない) という利点もあります。利用した OpenJPA 素晴らしい結果が得られました。

最近私が使っているのは JCR (Java コンテンツ リポジトリ) はますます増えています。私は、モジュールが単一のデータ ストレージを共有でき、構造とプロパティを進化させることができる方法が気に入っています。オブジェクトをデータベースにマッピングするよりも、ノードとプロパティを操作する方がずっと簡単だと思います。良い実装とは、 ジャックウサギ.

Spring に関しては、私が気に入っている機能がたくさんありますが、設定に必要な XML の量を考えると、私は決して使用することはありません。代わりに私は利用します ガイス そして絶対に気に入っています。

まとめとして、疑念を抱いている開発者に、Hibernate によってどのように作業が楽になるかを説明します。Spring に関しては、Guice が実行可能な代替手段であるかどうかを真剣にチェックし、Spring/Guice によって開発がどのように改善され、より容易になるかを示したいと考えています。

私は Spring/Hibernate 開発を数多く行ってきました。時間の経過とともに、人々が両方を組み合わせて使用​​する方法は少し変わりました。元の HibernateTemplate アプローチは、本来は有用な例外を飲み込んでラップするため、デバッグが難しいことが判明しています。Hiberante API と直接通信してください。

生成された SQL を引き続き確認してください (SQL を表示するように開発ログを構成します)。データベースに抽象化レイヤーがあるからといって、SQL で考える必要がなくなるわけではありません。そうしないと、良いパフォーマンスが得られません。

プロジェクトについて考えてみましょう。私は、厳しいパフォーマンス要件、複雑なレガシー スキーマ、または優れた SQL を作成できる優れた DBa が必要な場合に、Hibernate ではなく iBatis を何度か選択しました。

ハイバネートについては、次のようになります。これは、急速に変化するデータベース スキーマ、大量のテーブルを処理し、多くの単純な CRUD 操作を実行するアプリケーションにとって非常に優れたツールです。複雑なクエリが含まれるレポートは、あまり適切に処理されません。ただし、このような場合、私は JDBC またはネイティブ クエリを混合することを好みます。簡単に答えると、次のようになります。Hibernate の学習に時間を費やすのは良い投資だと思います (Hibernate は EJB3.0 と JPA 標準にも準拠していると言われていますが、私が個人的に使用するために評価したときには考慮されませんでした)。

春といえば…見る 胆汁のブログ :)

覚えて:フレームワークはそうではありません 特効薬, 、しかし、そうすべきではありません 車輪を再発明する どちらか。

Hibernate などのよく知られたフレームワークを使用すると、コードを特定の型や考え方に適合させることができるため、非常に役立ちます。つまり、Hibernate を使用しているので、特定の方法でコードを記述することになり、Hibernate を知っているすべてではないにしても、ほとんどの開発者は、あなたの考え方に簡単に従うことができるでしょう。

もちろん、これには欠点もあります。人気の Hibernate 開発者になる前は、正方形を円形の穴に合わせようとしていることに気づくでしょう。Hibernate が登場する前は何をしたいのか、そしてそれをどのように行うべきだったかはわかっていますが、Hibernate の方法を見つけるには時間がかかるかもしれません...かなりの時間。

それでも、コンサルタントを頻繁に雇用する企業 (短期間で多くのソース コードを理解する必要がある)、開発者が頻繁にサインオンと終了を繰り返す企業、または主要な開発者がサインオンするかどうかを賭けたくない企業の場合は、永久に留まり、決して転職しない -- Hibernate やその他の標準フレームワークは非常に良いアイデアだと思います。

/エース

Spring と Hibernate は、習得するのが難しいフレームワークです。フレームワークを理解しようとしている間は、期限が厳しいプロジェクトでこれらを使用するのは得策ではないかもしれません。

フレームワークの利点は基本的に、一貫したコードを製品にできるプラットフォームを提供しようとすることです。経験から、ベスト プラクティスを導入するフレームワークの経験を開発者に持たせることをお勧めします。

アプリケーションやデータベースの設計によっては、フレームワークがパフォーマンスを妨げないようにするために回避する必要がある問題もあります。

私の意見では、Spring の最大の利点は、より良い開発手法、特に疎結合、テスト、その他のインターフェイスを奨励し、可能にすることです。Spring なしで休止状態にするのは非常に面倒ですが、この 2 つを組み合わせると非常に便利です。

既存のプロジェクトをフレームワークに組み込むのは骨が折れる作業ですが、リファクタリング プロセスは長期的な保守性にとって大きなメリットとなることがよくあります。

これに関する多くの投稿に私は同意せざるを得ない。私は両方をさまざまな設定で広範囲に使用してきました。設計上の決定を元に戻せるとしたら、Hibernate を使用することでしょう。実際、私たちは製品の 1 つで Hibernate を iBatis に置き換え、Spring-JDBC を世界最高のアプローチに置き換えるリリースの予算を組みました。新しい開発者に Spring-JDBC、Spring-MVC、Spring-Ioc、iBatis の使用を、Hibernate だけを任せるよりも早く慣れさせることができます。

この KISS 開発者にとって Hibernate は複雑すぎます。そして、データベースが生成した SQL を DBA が確認し、最適化されたバージョンを送り返してくれれば、休止状態を実現できます。

一番上の回答では、Hibernate の文書化が不十分であると述べています。オンライン リファレンス マニュアルがもっと充実する可能性があることに同意します。ただし、Hibernate の著者によって書かれた本、「Hibernate による Java 永続化' はすべての Hibernate ユーザーにとって必読であり、非常に充実しています。

@slim - 今朝も一緒です。

典型的なケースのように聞こえますが、 ここで発明されていない症候群. 。春に興味がない場合は、独自のフレームワークを導入するのではなく、他のオプションを検討する必要があります (導入を認めるかどうかは関係ありません)。 ガイス 可能性として思い浮かびます。ピココンテナも。必要なものに応じて、他にもあります。

Spring と Hibernate は間違いなく作業を楽にしてくれます。最初は少し時間がかかるかもしれませんが、後で必ずその恩恵を受けるでしょう。XML は注釈に置き換えられるようになり、何百行もの XML を入力する必要もなくなりました。

検討してみてはいかがでしょうか AppFuse 学習曲線を短縮するには:アプリケーションを生成し、研究して適応させれば、すぐに出発できます。

フレームワークは悪ではありません。Java SDK もフレームワークです。

おそらく彼らが戦っているのは、 フレームワークの急増. 。フレームワークは、単なるきっかけのためにプロジェクトに導入すべきではなく、妥当な期間内に一貫した価値をもたらす必要があります。すべてのフレームワークには学習曲線が必要ですが、後で生産性と機能の向上が得られるはずです。

一貫性のないデータベースの使用、複雑なキャッシュ メカニズム、またはその他の無数の理由により、デバッグが難しいコードに苦労している場合。Hibernate は大きな価値をもたらします。学習曲線 (私の場合、実践的な作業に約 1 か月かかりました) を除けば、基本を説明してくれる人がいれば、落とし穴はありませんでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top