我正在将 Morphia 用于带有 Stripes 框架的 MongoDB。
让我们假设我有两个实体,Car(描述特定的汽车,比如一些特定的 1984 年本田雅阁)和 CarType(指定所有此类本田雅阁):
最自然的建模方法似乎是:
@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 时都会从 DB 中查找 CarType。我想在内存中缓存汽车类型,因为它们很少改变。像 GORM 和 Hibernate 这样的持久性框架可以开箱即用,但我不确定如何在 Morphia 下做到这一点(为此提出了一个功能请求)。
我想保留对 CarType 的引用,因为仅存储 String carTypeId 会使视图和其他所有内容变得过于复杂。
所以我想我可以做这样的事情:
@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 中有整体依赖注入工作。
所以我想:
- 了解如何将(最好是 Guice)服务注入 Morphia 实体
或者
- 了解如何正确缓存 Morphia 中的引用实体
或者
- 如果一切都失败了,请切换到其他一些支持缓存的 MongoDB POJO 映射方法。但我真的很喜欢 Morphia,所以我宁愿不喜欢。