Nano Hash - криптовалюты, майнинг, программирование

Spring MVC + Hibernate: как обрабатывать форму с отношением

У меня проблема с добавлением/обновлением записей с отношениями. Не могли бы вы посоветовать, как это должно работать?

У меня есть две сущности: Вопрос и Категория:

public class Question {
    @Id
    @GeneratedValue
    private Long questionId;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "category")
    private Category category;

а также

@Entity
@Table(name = "category")
public class Category {
    @Id
    @GeneratedValue
    private Long categoryId;
    private String name;

У меня есть список категорий, и я хотел бы добавить новый вопрос с выбранной категорией. Итак, в моем QuestionController у меня есть метод добавления:

@RequestMapping(value = "/add", method = RequestMethod.GET)
    public ModelAndView add() {
        ModelAndView mav = new ModelAndView("question/add");
        mav.addObject("question", new Question());
        mav.addObject("categoryList", categoryService.getAll());

        return mav;
    }

и форма:

<form:form modelAttribute="question" method="POST" >
    Name: <form:input path="name" value="${ques.name}" /> 
    Category: <form:select path="category" items="${categoryList}" />
    <input type="submit" value="Add" />
</form:form>

На данный момент все выглядит хорошо (я могу заполнить название вопроса и выбрать категорию). Но я не знаю, как должен работать метод добавления POST

@RequestMapping(value = "/add", method = RequestMethod.POST)
    public String added(@ModelAttribute Question question, BindingResult bindingResult) {

    }

Когда я пытаюсь использовать описанный выше метод, у меня возникает ошибка: Не удалось преобразовать значение свойства типа 'java.lang.String' в требуемый тип model.Category

Я пытался найти аналогичную проблему, но ничего не нашел. Так что, если кто-то может помочь/советом или показать ссылку на аналогичную проблему, я был бы признателен!

Ваше здоровье!


Ответы:


1

Вам нужно предоставить код для Spring, который сообщает ему, как преобразовать строковое значение с веб-страницы обратно в объект категории. Это делается либо:

  1. Добавление PropertyEditor в DataBinder.

  2. Создание преобразователя.< /а>

03.02.2014

2

Использование объектов гибернации для сопоставления элементов формы является плохой практикой. Есть два решения

  1. Добавьте еще одно свойство private transient String categoryString; в класс 'Question'. и сопоставьте категорию пользовательского интерфейса с этим <form:select path="categoryString" items="${categoryList}" /> Таким образом, вы можете избежать ошибки.

  2. Не используйте классы сопоставления гибернации для сопоставления элементов формы, используйте для этого POJO. а позже где-то в вашем приложении сопоставьте эти простые элементы pojo с объектом гибернации.

03.02.2014

3

попробуйте изменить эту строку:

<form:select path="category" items="${categoryList}" />

to:

<form:select path="category.categoryId" items="${categoryList}" itemLabel="name" itemValue="categoryId"/>

Затем в добавленном методе (метод публикации) извлеките объект категории из спящего режима и верните объект вопроса перед сохранением:

Category selectedCategory = yourHibernateService.getCategoryById(question.getCategory().getCategoryId());
question.setCategory(selectedCategory);
06.02.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..