0

StripesFrameworkを使用したMongoDBにMorphiaを使用しています。

Car(特定の車を表す、特定の1984 Honda Accordを表す)とCarType(その種類のすべてのHonda Accordを指定する)の2つのエンティティがあると仮定します。

これをモデル化する最も自然な方法は次のようです。

@Entity 
class Car {
     @Id private String id; // VIN
     private Date purchaseDate;
     private Color color;
     @Reference private CarType type;

     // ..
}

@Entity
class CarType {
     @Id private String id;
     private String manufacturerId;
     private float engineDisplacement;

     // ..
}

これは機能しますが、CarがロードされるたびにCarTypeがDBから検索されるため、非効率的です。車のタイプはめったに変更されないので、メモリにキャッシュしたいと思います。GORMやHibernateのような永続性フレームワークは、箱から出してそれを可能にしますが、Morphiaでそれを行う方法がわかりません(そのために発生した機能要求があります)。

文字列carTypeIdを格納するだけでは、ビューやその他すべてが複雑になりすぎるため、CarTypeへの参照を保持したいと思います。

だから私はこのようなことをすることができると思いました:

@Entity 
class Car {
     @Id private String id; // VIN
     private Date purchaseDate;
     private Color color;
     private String typeId;

     @Transient private CarType type;
     @Transient private CarService service = new CarServiceImpl();

     public void setTypeId() {
         this.typeId = typeId;
         updateTypeReference();
     }

     @PostLoad void postLoad() {
         updateTypeReference();
     }

     private void updateTypeReference() {
         type = service.findTypeById(typeId);
     }

     // ..
}

class CarServiceImpl implements CarService {
     @CacheResult CarType findCarTypeId(String typeId) {
         datastore.get(CarType.class, typeId);
     }

     // ..
}

これは機能し、私が望むことを実行しますが、:

  • ハックのように見えますか
  • 代わりにGuiceを使用してサービスを注入したいのですが、Stripes ActionBeansで全体的な依存性注入を行っていますが、その方法を理解できません。

だから私はどちらかをしたい:

  • Morphiaエンティティに(できればGuice)サービスを注入する方法を学ぶ

また

  • Morphiaで参照されるエンティティのキ​​ャッシュを適切に行う方法を学びます

また

  • 他のすべてが失敗した場合は、キャッシングをサポートする他のMongoDBPOJOマッピングアプローチに切り替えてください。しかし、私はモルヒネが本当に好きなので、むしろ好きではありません。
4

2 に答える 2

1

もう1つの一般的なアプローチは、各車にCarTypeを埋め込むことです。そうすれば、単一のエンティティをフェッチするだけで済みます。

トレードオフ:

  • 複製されたすべてのCarTypeの更新ロジックが必要になります。ほとんど変わらないとおっしゃっていたので、パフォーマンス的には問題ないはずです。
  • 複製されたデータには追加のディスクスペースが必要であり、RAMのワーキングセットも大きくなります。

これがデータに対してどのように機能するかを評価する必要がありますが、読み取りを高速化するためのデータ重複は非常に一般的なアプローチです...

于 2012-12-25T01:50:10.223 に答える
0

より良い解決策を考えていなかったので、静的変数からデータストアクラスを取得し、参照エンティティを検索できる@PostLoadイベントハンドラーを実行しています。

これはハックのようで、データストアサービスがスレッドセーフである必要がありますが、私にとっては機能します。

于 2013-01-04T10:50:52.557 に答える