0

我的 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”

我的 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}的事情,我该怎么做?

4

3 回答 3

1

不幸的是,您必须在 DAO 类中手动获取“uttente”。Objectify 中没有像 Twig 中那样的自动获取。在我的 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
}

是新版本的不断发展的设计文件。

2011 年 11 月 17 日更新:这是个大新闻。Twig作者 John Patterson 今天加入了 Objectify 项目。

于 2011-11-16T07:57:07.047 回答
1

我知道您必须手动获取这两个对象听起来很烦人,但是知道您正在加倍工作和时间来执行此操作实际上非常有用 - 每个“get”调用都需要一段时间,而第二个不会开始直到第一个完成。它是一个典型的 NoSQL 环境,您不应该经常需要拥有两个独立的实体——您这样做有什么理由吗?

我很容易想到的原因只有两个:

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

  2. 您将另一个嵌入的类(在您的情况下为“Fattura”)中有大量数据,您不希望在获取“用户”的同时获取这些数据 - 您需要用户它自己比你需要“Fattura”和“用户”更频繁。当您确实需要“Fattura”时,需要相当多的数据才能值得额外的数据存储调用。

于 2011-11-16T08:20:45.043 回答
-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 实例,并且在此实体的初始加载之后不会向数据存储/内存缓存发出请求。

于 2011-11-16T09:01:51.200 回答