14

レガシー データベース (レガシー PHP クライアントがまだある) に hibernate を実装しようとしていますが、元のアプリを書いた人が何をしているのかわからなかったため、いくつかの問題が発生しています。

データベースはどの列も NULL 可能にならないように設定されているため、レコードがない場合、外部キーはデフォルトで 0 になります。さらに、テーブルに適切な外部キーがないため、無効な ID を持つものがいくつかあります。スキーマを変更したり、適切な列を null にするオプションがありません。

これは、休止状態から得られるエラーです:

Caused by: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tv.platform.domain.Program#0]

私が望むのは、行が無効であるか存在しない場合にフィールドが null になる、この泥に対処するための優雅な方法ですが、ドキュメントでこれを処理する方法を見つけることができません。

任意のヒント?

4

4 に答える 4

16

注釈: @NotFound( action = NotFoundAction.IGNORE )

私が探していたものを正確に実行します。私はここでそれを見つけました:

Hibernate 多対 1 外部キー デフォルト 0

于 2011-04-26T21:21:14.163 に答える
2

Hibernate がこの種の問題に適しているとは思えません。Hibernate は、テーブル内のレコードが相互に関連していることを期待しており、外部キーの関係がたまにしか強制されない場合、実際には機能しません。このように動作するように Hibernate を変更または構成するのが簡単だとは想像できません。つまり、壊れた外部キー関係を処理する方法を知ることです。

プログラム外部のファイルにデータをロードするための SQL ステートメントを提供するMyBatis SQLMapsのようなフレームワークからより多くのマイレージを得ることができますが、フレームワークはSELECTステートメントをチェーンして完全なオブジェクト グラフをロードするためのオプションを提供します。このようにして、値を除外するロジックで SQL ステートメントを補足することができ0ます。

于 2011-04-26T19:19:01.400 に答える
1

迎撃機がうまくいくかもしれないと思います。

于 2011-04-26T19:52:50.440 に答える
0

最近、同様の問題があるレガシーデータベースに対してWebアプリをプログラムしました。複数のデータアクセスフレームワークを使用したくない場合でも、Hibernateを使用できます。私がやったことは、「createSqlQuery」を使用してトリッキーな部分のネイティブSQLクエリを書き出すことです。場合によっては、完全なサブクエリまたは計算値をエンティティプロパティにマップする必要がありましたが、機能します。より規則的なデータベースの部分については、通常のHibernateマッピングとcriteria/HQLクエリを引き続き使用できます。

もう1つのこと:「彼らが何をしていたのかわからない」や「少しマック」などの用語の使用は控えるべきかもしれません。前任者が残したコードを劣ったものと見なしたくなることは知っていますが、これらの人々はおそらく当時可能な限り最善を尽くしていたことを理解してください。また、あなた自身のコードも完璧ではないので、ある程度の謙虚さがあります。なんで?一つには、あなたが非常に知識があると思っていた以前の開発者についていつも口の周りで泡立っていなければ、あなたの周りの人々はあなたと少しうまくやっていくかもしれません。ちょっとしたヒント。

于 2011-04-26T19:54:26.703 に答える