Передача сложных объектов JPA в контроллер с POJO - PullRequest
2 голосов
/ 01 апреля 2011

Моя команда кодирует приложение, которое включает редактирование страниц, похожих на википедию.Это похоже на проблему, которую мы имеем с регистрацией:

Простая реализация дает что-то вроде

public static void doRegistration(User user) {
//...
}

Пользовательский параметр - это JPA-объект.Модель User выглядит примерно так:

@Entity
public class User extends Model {

//some other irrelevant fields

@OneToMany(cascade = CascadeType.ALL)
public Collection<Query> queries;

@OneToMany(cascade = CascadeType.ALL)
public Collection<Activity> activities;
//...

Я прочитал здесь и там , что это не удается.Теперь, в Play !, какой лучший курс действий мы можем предпринять?Должен быть какой-то способ поместить все эти данные, которые должны быть отправлены на сервер, в один объект, который легко можно сохранить в базе данных.

РЕДАКТИРОВАТЬ: причина, по которой это не удается, из-за ошибки проверки.Это как-то говорит «неверное значение» при проверке объектов коллекции.Мне было интересно, можно ли этого избежать.

РЕШЕНИЕ: Изменение Коллекции в Список решило проблему.Это ошибка, которая будет исправлена ​​в игре 1.2:)

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

Это не подведет. Если у вас запущена транзакция, все будет сохранено. Просто отметьте, что транзакции обычно выполняются внутри сервисов, а не контроллеров, поэтому вы должны передать их от контроллера сервису.

1 голос
/ 01 апреля 2011

это работает. Чтобы быть более понятным, вы можете определить метод контроллера, подобный тому, который вы написали:

public static void doRegistration(User user) {
//...
}

Это совершенно нормально. Просто сопоставьте его с POST-маршрутом и используйте # {форму} для отправки объекта, например:

#{form id:'myId', action:@Application.doRegistration()}
   #{field user.id} 
   [...]
#{/form}

Это работает. У вас могут возникнуть проблемы, если вы не добавите все поля сущности в форму (если некоторые поля недоступны для редактирования, используйте скрытые входные данные или аннотацию NoBinding, как описано здесь ).

РЕДАКТИРОВАТЬ: для субъекта OneToMany, отношения будут управляться стороной «Многие». Эта сторона должна хранить идентификатор связанной сущности как скрытое поле (со значением object.user.id). Это решит все связанные с этим вопросы.

...