Spring/Hibernate 未保留从 HTML 表单提交的所有数据

Spring/Hibernate not persisting all data submited from HTML Form

在我目前的 spring pŕoject 中,我有一个这样的表格:

<form role="form" class="form" id="form" method="post" action="/loja/pagina/insert" enctype="multipart/form-data">
        <input class="form-control" type="hidden" name="id" />

        <label>Title</label>
        <input class="form-control" type="text" name="titulo" />

        <ul class="nav nav-tabs" role="tablist">
          <li role="presentation" class="active">
            <a href="#pt-BR" aria-controls="pt-BR" role="tab" data-toggle="tab">pt-BR</a>
          </li>
          <li role="presentation">
            <a href="#es-ES" aria-controls="es-ES" role="tab" data-toggle="tab">es-ES</a></li>
          <li role="presentation"><a href="#en-US" aria-controls="en-US" role="tab" data-toggle="tab">en-US</a></li>
        </ul>

        <div class="tab-content">
          <div role="tabpane1" class="tab-pane active" id="pt-BR">
            <input type="hidden" name="textos.idioma" value="pt-BR" />
            <textarea class="summernote" name="textos.conteudo"></textarea>
          </div>

          <div role="tabpane1" class="tab-pane" id="es-ES">
            <input type="hidden" name="textos.idioma" value="es-ES" />
            <textarea class="summernote" name="textos.conteudo"></textarea>
          </div>

          <div role="tabpane1" class="tab-pane" id="en-US">
            <input type="hidden" name="textos.idioma" value="en-US" />
            <textarea class="summernote" name="textos.conteudo"></textarea>
          </div>
        </div>
</form>

当我将此表单提交给此方法时:

控制器

@RequestMapping(value = "/insert", method=RequestMethod.POST)
@ResponseBody
@PreAuthorize("hasPermission(#user, 'insert_'+#this.this.name)")
public void insert(@Valid E object, BindingResult result) {
    serv.insert(object);
}

服务

@Transactional
public void insert(E object) {
    dao.insert(object);
}

dao

@Transactional
public void insert(E object) {
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
        tx = session.beginTransaction();
        session.persist(object);
        tx.commit();
    } catch (Exception e) {
        if(tx != null)
            tx.rollback();
    } finally {
        session.close();
    }
}

只有字段 titulo 被保留。字段 textos ,由此实体 class 表示(吸气剂和 setter 省略):

@Entity
public class Texto extends Model {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @Column
    private String idioma;

    @Column
    private String conteudo;
}

没有保存在数据库中。任何人都可以说出实现表单以正确存储此数据的正确方法是什么?我查看了浏览器的开发者工具,正在提交数据,只是没有持久化到数据库中。

我假设,您的模型 class Texto 与 class E 具有 @OneToMany 关系,因此一个 E 引用多个 Texto 实例。如果这是您的模型表达的内容,您必须对文本区域名称使用不同的语法才能Spring 能够解析您的请求负载。

在你的情况下 Spring 将在你的 class E 上搜索 属性 textos.conteudo。正如我所假设的那样,textos 将是一个集合,Spring 将忽略它。

假设,textos 将被建模为基于索引的集合,如 List,尝试将您的文本区域名称重命名为 name="textos[0].conteudo" 等等,以告诉 Spring textos 是一个列表,并且 Spring 将能够解析 POST 负载。

根据用户@AnsgarSchulte 在这个问题中给我的提示,我更改了 name="textos[0] 表单中的 html 代码,并更改我的 PropertyEditorSupport class 来处理这个问题数组和 return 一个 Texto 对象,其中 属性 idioma 是向量的第一个元素, 属性 conteudo 是剩下的所有元素(将所有这些连接成一个字符串)。