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
是剩下的所有元素(将所有这些连接成一个字符串)。
在我目前的 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
是剩下的所有元素(将所有这些连接成一个字符串)。