2

ORMLiteでオブジェクトの階層を読んでいます。それは木のような形をしており、親に@ForeignCollection0+子があり、すべての子はその親をで参照し@DatabaseField(foreign=true)ます。階層全体を一度に読んで保存しています。

私はORM全般、およびORMLiteを初めて使用するため、データベース内の同じIDを持つオブジェクトが読み取られたときに、同じIDを持つ実際に同じオブジェクトとして作成されないことを知りませんでした。ただし、同じIDを持つ複数の複製として。つまり、私は今、(「->」は「参照する」を表すとしましょう)A-> B-> C!= C->B->Aという問題に直面しています。

提供されたDAOを手動で読み取り、IDでまとめて、同じIDを持つオブジェクトが同じIDを持つようにすることで、問題を解決しようと考えていました。

これを解決するORMLiteネイティブの方法はありますか?はいの場合、それは何ですか、そうでない場合、この問題を解決する一般的な方法は何ですか?これはORMの一般的な問題ですか?名前はありますか(詳しく知りたい)?

編集:

私の階層では、1つの建物に複数のフロアが含まれ、各フロアがその建物を認識し、各フロアに複数のゾーンが含まれ、すべてのゾーンがそのフロアを認識します。

4

2 に答える 2

3

これは ORM の一般的な問題ですか? 名前はありますか(詳しく知りたいのですが)?

これは ORM の一般的なパターンであり、「アイデンティティ マップ」と呼ばれます。セッション内では、コードのどこで ORM からマップされたオブジェクトを取得しても、データベース内の特定の行を表すオブジェクトは 1 つだけです (つまり、主キーです)。

私はこのパターンが大好きです。コードの一部でデータベースから何かを取得したり、変更を加えたり、そのオブジェクトをインスタンス変数に格納したりできます。コードの別の部分では、同じ「データベース行」のオブジェクト (何らかの方法で: 引数として渡された、データベースへの一括クエリを作成した、主キーが同じに設定された「新しい」マップされたオブジェクトを作成し、それを追加した)セッションに)、同じオブジェクトになります。– 以前からの変更 (フラッシュされていないものを含む) も存在します。

(このため、マップされたオブジェクトをセッションに追加すると失敗する場合があり、ORM とプログラミング言語によっては、この追加によって別のオブジェクトが「同じ」として返される場合があります)

于 2011-07-22T05:29:02.747 に答える
1

残念ながら、この問題を解決する ORMLite ネイティブの方法はありません。より複雑な ORM システム (Hibernate など) には、この理由のために特別に存在するキャッシュ層があります。ORMLite にはキャッシュ層がないため、「最近」同じ ID を持つオブジェクトが返されたことを認識しません。Hibernate キャッシングのドキュメントは次のとおりです。

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

ただし、ORMLite は Lite として設計されており、キャッシュ レイヤーはその指定 IMO に違反しています。ORMLite でのあなたの問題に対する唯一の [残念な] 解決策は、ID に基づいてオブジェクト ツリーを再構築することです。ヒエラルキーについて詳しく教えていただければ、より具体的にサポートできる場合があります。


したがって、@riwi のケースについてもう少し考えた後、Floors のコレクションを含む Building がある場合、コレクション内の各 Floors の Building オブジェクトを親建物オブジェクト。当たり前。ORMLite には、これを実現するために必要なすべての情報があります。この動作を実装し、バージョン 4.24 でリリースされました。

編集:

ORMLiteバージョン 4.26の時点で、要求された機能をサポートできるオブジェクト キャッシュの最初のテイクを追加しました。ドキュメントは次のとおりです。

http://ormlite.com/docs/object-cache

于 2011-07-14T13:53:28.817 に答える