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マッピングアプローチに切り替えてください。しかし、私はモルヒネが本当に好きなので、むしろ好きではありません。