【问题标题】:Objectify + JSP: displaying 1:N relationshipsObjectify + JSP:显示 1:N 关系
【发布时间】:2011-12-30 04:49:24
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    不幸的是,您必须在 DAO 类中手动获取“utente”。 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
    }
    

    Here正在改进新版本的设计文档。

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

    【讨论】:

    • 我怀疑是这样的......所以我必须为每个键关系保留重复的属性吗?这不是很好!你建议我使用 Twig 还是 JDO/JPA?
    • 我用指向 Objectify4 文档的链接更新了我的答案。一个月前我有确切的想法,法比奥。我最终选择了 Objectify,因为我的项目将在巨大的负载下工作,并且我希望拥有干净简单的代码,让我了解正在发生的一切。我正在考虑 Twig,但最近似乎不太支持该项目。根据 JPA,我喜欢它,但因为 Datastore 不是 RDBMS GAE 的 JPA 实现有许多奇怪的限制,而且它对 Datastore 进行了大量冗余调用,这会花费你真钱。
    • 很好的答案!我想知道新的@Load 将如何适合我的“客户发票”用例,但我相信会有出色的文档。我还从可怕的 cmets 来到 Objectify,了解如何将 JDO 与 GAE 结合使用。你知道是否会长期支持 Objectify(我未来的项目需要一些非常可靠的可靠性)?
    • 我们或许应该向 Jeff Schnitzer 提出这个问题 :) 但他说他有三个使用 Objectify 的现有项目。我认为他不会很快停止工作。
    • JFYI,Twig 作者,John Patterson,今天加入了 Objectify 项目。
    【解决方案2】:

    您不一定必须使用临时字段来获取对象。

    这行得通:

    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 实例,并且在此实体的初始加载后不会向数据存储/内存缓存发出请求。

    【讨论】:

    • 我显然已经知道了:但我不希望我的实体 POJO 被绑定/耦合到持久层!
    【解决方案3】:

    我知道您必须手动获取这两个对象听起来很烦人,但知道您将工作和时间加倍这样做实际上非常有用 - 每个“获取”调用都需要一段时间,而第二个调用则获胜'直到第一个完成后才开始。这是一个典型的 NoSQL 环境,您不应该经常需要拥有两个独立的实体 - 您这样做有什么原因吗?

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

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

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

    【讨论】:

    • 我无法 100% 理解您的回答 ....“这是一个典型的 NoSQL 环境,您不应该经常需要两个单独的实体”...但我确实需要使用不幸的是,像 RDBMS 这样的数据存储区,所以我要做的只是一个简单的手动“JOIN”。您如何在 objectify-gae 中编写简单的一对多关系?考虑一个基本案例,例如 OFFICE(1) => PERSON(MANY)
    • “这是一个典型的 NoSQL 环境,你不应该经常需要拥有两个独立的实体 - 你这样做有什么理由吗?”你能简单地给我解释一下吗?
    • 抱歉,我以为您试图表示一对一的关系,这通常是不需要的。如果你想显示一对多,这取决于你如何使用它是最好的。例如,您可以使用办公室对象上的 List 列出办公室中的所有用户。你最常见的用途是什么?您更常查找用户所属的办公室还是查找办公室中的用户列表?
    • 感谢您的回复!我的答案是……两者都有!考虑“客户”和“发票”:包含“意大利客户”所有发票金额的报告将与包含 2011 年 6 月所有发票以及相关客户的报告一样有用!现在我正在做两个单独的提取,一个“手动连接”...... Objectify4 将引入@Fetch 注释......让我们看看! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2022-09-23
    相关资源
    最近更新 更多