spring hibernate 多对一的关系,前端向后台传输数据时,为什么要传外键的属性.id,比如logo.id,如果不以类似这样的传logo.id,而是这样传 logo,spring就会报错
使用过谷歌查询,但没有我想要的答案,是不是和spring的设计有关
相关代码
public class ProductCategory extends BaseObj {
/**
* 品类图片
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "logo_id")
private Picture logo;
}
- 前端向后台传输的正确代码,因为 name = logo.id:
<tr>
<td>图片:</td>
<td>
<div class="clearfix">
<input v-model="modalData.logo['id']" name="logo.id"/>
</td>
</tr>
- 前端向后台传输的错误代码,因为 name = logo:
<tr>
<td>图片:</td>
<td>
<div class="clearfix">
<input v-model="modalData.logo['id']" name="logo"/>
</td>
</tr>
我希望能从根本上说明,为什么一定要带属性的id,否则就会报错呢?跪谢众位大神
这是springframework报出的类型转换错误,因为我们在传logo.id时,logo.id是一个字符串的格式,而logo则认为是一个对象(一个图片的对象)。spring在数据转化为没有图片的这个类型, 于是数据格式转化出错,便报出了这样的错误。
因为,spring在通过反射创建对象时,首先是根据查找该对象属性是不是java自带的类型,比如八大基本类型(其包装类型)、字符串类型、日期类型。
如果是java的自带的数据了类型,可以根据对象的属性填充值。
如果不是java自带的数据类型,默认是根据属性创建对象,如果没有上传其属性对象的属性,其就会报出数据类型错误:org.springframework.validation.BeanPropertyBindingResult: 1 errors;如果我们上传了其属性对象的属性,比如上面的问题:logo.id,其会根据属性对象的属性来创建这个picture对象的,如图所示:
这和spring的自动装配息息相关的。