我的bean看起来像那样:
@Entity
public class Fattura {
@Id
Long id;
@NotEmpty
String numero;
@Min(value=0)
Double importo;
Key<User> utente;
// gets & sets....
}
“utente”属性是我创建的另一个bean的关键:“Fattura”只能有一个“User”,一个“User”可以有很多“Fattura”s
My Spring MVC控制器将管理对Fattura列表的请求,并将其显示在一个简单的jsp中:
@RequestMapping( value = "/fatture" , method = RequestMethod.GET )
public ModelAndView leFatture() {
ModelAndView mav = new ModelAndView("fatture");
mav.addObject("fatture",fatturaService.listFatture());
return mav;
}
jsp的代码非常简单:只有表中的foreach循环
我的问题是:
如何显示“utente”?
我唯一拥有的是它的关键,但我想在我的JSP中执行类似 $ {fattura.utente.firstName} 的操作,我该怎么办?
答案 0 :(得分:1)
不幸的是,您必须在DAO类中手动获取“utente”。像Twig中的Objectify没有自动获取。在我的POJO中,我有以下字段
@Transient private Organization sender; // Pickup location (for client RPC)
transient private Key<Organization> senderKey; // Pickup location (for Datastore)
我从Datastore加载实体,然后使用senderKey手动加载组织。
在新的Objectify4中,你将能够做到你想做的事情:
class Beastie {
@Parent
@Load
ParentThing parent;
@Id Long id;
@Load({"bigGroup", "smallGroup"})
SomeThing some;
@Load("bigGroup")
List<OtherThing> others;
@Load
Ref<OtherThing> refToOtherThing;
Ref<OtherThing> anotherRef; // this one is never fetched automatically
}
Here 正在发展新版本的设计文档。
2011年11月17日更新:这是个大新闻。 Twig 作者John Patterson今天加入了Objectify项目。
答案 1 :(得分:1)
我知道你必须手动获取这两个对象听起来很烦人,但实际上知道你的工作和时间加倍是很有用的 - 每次“获取”通话需要一段时间而第二次获胜直到第一个完成才开始。它是一个典型的NoSQL环境,你不应该经常需要有两个独立的实体 - 你有什么理由吗?
我可以轻易想到的原因只有两个:
该类引用了同一类型的另一个对象 - 这是Objectify文档中的示例,其中一个人可以引用他们的配偶,也是一个人。
您将另一个嵌入其中的类(在您的情况下为“Fattura”)中包含大量数据,您不希望同时获取这些数据以获取“用户” - 并且你需要用户自己比你需要“Fattura”和“User”更频繁。当你想要“Fattura”时,需要相当多的数据值得额外的数据存储调用。
答案 2 :(得分:-1)
您不一定要使用临时字段来获取对象。
这有效:
public User getUtente() {
Objectify ofy = ObjectifyService.begin();
return ofy.get(utenteKey);
}
每次调用getter时,这当然会做一个数据存储区get()。您可以通过在User实体上使用@Cached来改善这一点,因此在第一次调用后它们会变成memcache调用。 Memcache很好,但我们可以使用会话缓存做得更好:
public User getUtente() {
Objectify ofy = myOfyProvider.get();
return ofy.get(utenteKey);
}
这里的关键是你需要提供(通过myOfyProvider)一个Objectify实例,该实例绑定到当前请求/线程,并且启用了会话缓存。 (即,对于任何给定的请求,myOfyProvider.get()应返回相同的Objectify实例)
在此设置中,每次调用getter时都会从会话缓存中返回完全相同的User实例,并且在初始加载此Entity之后不会对数据存储区/ memcache发出任何请求。