Objectify + JSP: отображение отношений 1: N - PullRequest
0 голосов
/ 16 ноября 2011

Мой бин выглядит так:

@Entity
public class Fattura {

    @Id
    Long id;

    @NotEmpty
    String numero;

    @Min(value=0)
    Double importo;

    Key<User> utente;

    // gets & sets....
}

Свойство "utente" является ключом другого бина, который я создал: у "Fattura" может быть только один "пользователь", у одного "пользователя" может бытьмногие "Fattura" s

Мой 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"?

Единственное, что у меня есть, это его ключ, но я хотел бы сделать что-то вроде $ {fattura.utente.firstName} в моем JSP, как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 16 ноября 2011

Я знаю, это звучит раздражающе, что вам нужно вручную выбрать два объекта, но на самом деле очень полезно знать, что вы удваиваете свою работу и время, чтобы сделать это - каждый вызов get занимает некоторое время, а второй выигрываетне начинайте, пока не закончите первый.Это типичная среда NoSQL, вам не нужно часто иметь два отдельных объекта - есть ли причина, по которой вы это делаете?

Есть только две причины, о которых я могу легко думать:

  1. Класс ссылается на другой объект того же типа - это пример в документации Objectify, где у человека есть ссылка на его супруга, который также является человеком.

  2. Класс, в который вы встраиваете другого («Fattura» в вашем случае), содержит массу данных, которые вы не хотите извлекать в то же время, как вы хотите получить «пользователя» - и вам нужнопользователь сам по себе чаще, чем вам нужны «Фаттура» и «Пользователь».Когда вы действительно захотите «Фаттуру», потребуется достаточно много данных, чтобы оправдать дополнительный вызов хранилища данных.

1 голос
/ 16 ноября 2011

К сожалению, вам придется вручную извлекать "utente" в вашем классе DAO. В Objectify нет автоматической загрузки, как в Twig. В моих POJO у меня есть следующие поля

@Transient private Organization sender;             // Pickup location (for client RPC)
transient private Key<Organization> senderKey;      // Pickup location (for 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
}

Здесь находится в стадии разработки проектной документации новой версии.

Обновление от 17 ноября 2011 г .: Это большие новости. Twig Автор, Джон Паттерсон, присоединился к проекту Objectify сегодня.

0 голосов
/ 16 ноября 2011

Вам не обязательно использовать временное поле только для получения объекта.

Это работает:

public User getUtente() {
    Objectify ofy = ObjectifyService.begin();
    return ofy.get(utenteKey); 
}

Это, конечно, будет делать метод get () хранилища данных каждый раз, когдагеттер называется.Вы можете улучшить это, используя @Cached в вашей сущности User, чтобы они превращались в вызовы memcache после первого вызова.Memcache хорош, но мы можем сделать немного лучше, используя кеш сеанса:

public User getUtente() {
    Objectify ofy = myOfyProvider.get();
    return ofy.get(utenteKey); 
}

Ключевым моментом здесь является то, что вам нужно предоставить (через myOfyProvider) экземпляр Objectify, который привязан к текущему запросу/ поток, и это с включенным кэшем сеанса.(т.е. для любого данного запроса myOfyProvider.get () должен возвращать один и тот же экземпляр Objectify)

В этой настройке точно такой же экземпляр User будет возвращаться из кэша сеанса каждый раз, когда вызывается метод полученияи никакие запросы к хранилищу данных / memcache не будут выполняться после начальной загрузки этого объекта.

...