2014-12-23 3 views
0

Мне нужно определить a для создания экземпляров одного из моих объектов. Это простая задача, и у меня уже есть некоторые, но у этого конкретного объекта есть ссылка на другой объект, который я должен определить в форме. Как это может быть сделано? Я знаю, что могу попросить пользователя ввести идентификатор, сохранить его в DTO и получить реальный объект позже, но я полагаю, что это не лучший способ выполнить это. Что я могу сделать?Как определить формы для сохранения сложных объектов весной?

Я поставил здесь свои объекты:

@Entity 
public class Route { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(nullable = false) 
    private Long distance; 

    @Column(nullable = false) 
    private String name; 

    private String description; 

    @ManyToOne 
    @JoinColumn 
    private Place origin; 

} 

И это объект ссылки:

@Entity 
public class Place { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(nullable = false) 
    private String name; 

    private Long latitude; 

    private Long longitude; 

    private String imagePath; 

    @OneToMany(mappedBy = "origin", cascade = CascadeType.REMOVE) 
    private Set<Route> originRoutes; 

} 
+0

Являются ли они единственными 2 сущностями, поддерживающими форму? –

+0

Если у вас есть меньшее количество мест (что, я полагаю, не так), вы можете поместить список всех мест в качестве атрибута модели и отобразить их в поле выбора, которое будет привязываться к идентификатору места в объекте формы поддержки. Если у вас есть большое количество мест, я думаю, лучшим подходом было бы создание автозаполнения AJAX для Place на основе его имени для примера. –

+0

@ JamieWhite да, я использую только те сущности в этой форме. –

ответ

0

Это на самом деле зависит от того, что случай использования более подробно. Давайте подумаем пару возможностей:

Создать Место вместе с некоторыми Маршруты мгновенно на одном дыхании - в этом случае я бы реализовать вид так, что он создает сложную структуру, отражающую сущности один к одному как вы их определили для JPA, и передает один запрос POST. В основном мы предполагаем, что существует ограниченное количество маршрутов, которые всегда создаются вместе с местами. Маршруты не могут быть использованы между разными . Места, как нет смысла.

@RequestMapping(method = POST, value = "/places") 
public CreatePlaceResponse createPlace(@RequestBody Place place) { 
    ... 
} 

Создать Место и обеспечить маршруты в последующих запросах. - если мы хотим больше гибкости и/или ожидаем, что количество маршрутов, назначенных для каждого места, будет большим, мы можем сначала создать место Place и после этого использовать другой запрос для назначения маршрутов (ссылаясь на место Я бы). Таким образом, вы позволяете пользователю создавать всю структуру шаг за шагом, плюс вы даете возможность добавить Маршрут позже.

@RequestMapping(method = POST, value = "/places") 
public CreatePlaceResponse createPlace(@RequestBody Place place) { 
    ... 
} 

@RequestMapping(method = POST, value = "/places/{placeId}") 
public AddRouteResponse addRoute(@RequestBody Route route) { 
    ... 
} 

В зависимости от случая вы можете думать о насыпном создании маршрутов, так что прохождение списка Маршрутов в уже созданном место.

+0

Проблема в том, что я не хочу размещать объявления в маршрутах. На самом деле эти отношения могут быть неразделенными. Мне нужно только создать маршруты, в которых мне нужно установить место происхождения и место назначения. Я удалил целевые переменные, чтобы упростить чтение. –

+0

Ну, это точно, как я это понял. Сначала создайте место, а затем назначьте ему маршруты. Я не вижу свойство назначения в вашем объекте Route. Если это так, вам определенно нужно сделать это двумя шагами. Поэтому сначала определите места, а затем привяжите их маршрутом в отдельном вызове. В этом случае запросы выглядели бы немного иначе. – macias

0

На стороне пользовательского интерфейса я вижу, как это работает, используя скрытое поле для хранения идентификатора места в ответ на введенный текст или «причудливый» выбор, такой как один из них внизу, который позволяет вводить выбранный для фильтрации и не будет загружать 1000s записи в памяти сразу:

http://silviomoreto.github.io/bootstrap-select/

в любом случае, вы собираетесь связать скрытое поле или выбранной опции для:

route.place

например

<form:hidden path="place" value="id_of_place_updated_by_javascript" /> 

или

<form:select path="place"> 

Вы затем зарегистрировать конвертер, который преобразует поданную значение требуемого типа т.е. Плейс. При отправке конвертера вы берете идентификатор места и извлекаете соответствующее место из базы данных. Затем структура свяжет место, возвращаемое конвертером, в Route, поддерживающее форму.

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert

Смотрите здесь для примера, используя Formatter, чтобы сделать преобразование:

http://springinpractice.com/2012/01/07/making-formselect-work-nicely-using-spring-3-formatters

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

Смежные вопросы