Objectify + JSP:显示1:N关系

时间:2011-11-16 07:47:47

标签: java google-app-engine jsp spring-mvc objectify

我的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} 的操作,我该怎么办?

3 个答案:

答案 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环境,你不应该经常需要有两个独立的实体 - 你有什么理由吗?

我可以轻易想到的原因只有两个:

  1. 该类引用了同一类型的另一个对象 - 这是Objectify文档中的示例,其中一个人可以引用他们的配偶,也是一个人。

  2. 您将另一个嵌入其中的类(在您的情况下为“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发出任何请求。