Spring Многие ко многим не сохраняются при отправке формы

#java #spring #thymeleaf

#java #spring #thymeleaf

Вопрос:

У меня есть следующие объекты:

 @Entity
public class LabelGroup{
    transient Logger logger = LoggerFactory.getLogger(LabelGroup.class);

    @OneToMany(mappedBy = "labelGroup", cascade = CascadeType.ALL)
    List<Token> tokens;

    public List<Token> getTokens() {
        return tokens;
    }

    public void setTokens(List<Token> tokens) {
        for (Token t: tokens){
            this.addToken(t);
        }
    }

    public void addToken(Token token){
        token.setLabelGroup(this);
        tokens.add(token);
    }


    @Override
    public void copy(LabelGroup other) {
        setName(other.getName());
        setBody(other.getBody());
    }

    @Override
    public String getEditURL() {
        return CrudEntityController.getEitURL(CrudEntityController.LABEL_GROUP_PREFIX).replace("{id}",this.getId() "");
    }

    public LabelGroup() {
        tokens = new ArrayList<>();
    }
}
  

и

 @Entity
public class Token {
    @Column(nullable = false,name = "token_key")
    String key;
    @Column(nullable = false,name = "token_value")
    String value;

    @ManyToOne(cascade = CascadeType.ALL)
    LabelGroup labelGroup;

    public Token() {
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public LabelGroup getLabelGroup() {
        return labelGroup;
    }

    public void setLabelGroup(LabelGroup labelGroup) {
        this.labelGroup = labelGroup;
    }
}
  

у них также есть идентификаторы, но они оставили их здесь…

У меня есть эта форма для редактирования / создания групп меток:

 <form th:action="@{__${url}__}" method="post" th:object="${newGroup}">
    ...
    <th:block th:each="token, iter: ${newEntity.getTokens()}">
         <input type="text" th:field="*{tokens[__${iter.index}__].key}">
         <input type="text" th:field="*{tokens[__${iter.index}__].value}">
    </th:block>
</form>
  

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

 @PostMapping(NEW_URL)
public String newEntitySave(@Valid @ModelAttribute("newEntity") LabelGroup entity, BindingResult result, Model model){
    checkPermissionByType(NEW_URL);

    boolean valid;

    if(result.hasErrors()){
        valid = false;
    }else {
        valid = validateNewEntity(entity,result);
    }

    if(valid){

        getRepository().save(entity);
        
        return getRedirectIndex();
    }else{
        setupModelForEntityForm(null,model,null);
        return FORM_TEMPLATE;
    }
}
  

Редактировать:

Мне кажется, что spring не вызывает установщики, а устанавливает значения напрямую. Это правильно? Если это так, labelGroup количество токенов не задано. Но действительно ли единственный способ обойти это — повторять токены и устанавливать значение вручную перед сохранением объекта?

Комментарии:

1. Ваши идентификаторы автоматически сгенерированы или отправлены формой?

2. Они автоматически генерируются