Hibernate OrderColumn с Spring Roo - PullRequest
       16

Hibernate OrderColumn с Spring Roo

2 голосов
/ 06 февраля 2012

Я использую аннотацию @OrderColumn Hibernate, чтобы упорядочить список в моей базе данных.Он правильно генерирует столбец в таблице базы данных для хранения индекса, а также изначально сохраняет правильный индекс.

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

Вот код моей сущности:

@RooJavaBean
@RooToString
@RooEntity
public class Story {

    @ManyToMany(cascade = CascadeType.ALL)
    @OrderColumn
    private List<Slide> slides = new ArrayList<Slide>();

    @ManyToOne
    private Question question;

    private String title;

}

Вот метод обновления, который вызывает merge функцию:

@RequestMapping(method = RequestMethod.PUT)
public String StoryController.update(@Valid Story story, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) {
    if (bindingResult.hasErrors()) {
        uiModel.addAttribute("story", story);
        return "storys/update";
    }
    uiModel.asMap().clear();
    story.merge();
    return "redirect:/storys/" + encodeUrlPathSegment(story.getId().toString(), httpServletRequest);
}

Я проверил с помощью отладки, чтообъект story имеет обновленные индексы в списке slides.

1 Ответ

0 голосов
/ 13 февраля 2012

Когда вы говорите:

Он правильно генерирует столбец в таблице базы данных для хранения индекса, а также изначально сохраняет правильный индекс.

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

log4j.logger.org.hibernate.SQL=DEBUG

к log4j.properties и просмотреть журнал.

Мне нужно было добавить явное @JoinTable к ассоциации, чтобы все операции были каскадно корректно.

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable
@OrderColumn
private List<Slide> slides = new ArrayList<Slide>();
...