Spring+Hibernate+Mysql开发常见问题记录
好吧,又开新坑,本来对spring mvc框架很不熟,忽然被拉来做系统开发,以此文记录遇到的各种异常,同时学习mis系统开发。
1. not-null property references a null or transient value
使用hibernate建立mysql表有三种方式,比较简单的为建立Java类,使用hibernate直接建表(不需要mysql建表)。
比如有两个类A、B对应表tA,tB,同时A类中成员包含B类的对象,即:
public class A{
@Id
@GeneratedValue
private Long id;//序号
@Column(length=200,nullable=false,unique=true)
private String name;//名字
@ManyToOne(optional=false)
private B b;
getter and setter...
}
向A表做更改时,如果没有对A中成员b赋初值或未引用类B的对象且类A中b成员不能为空,则会出现此错误。即使手动生成B的对象b0,执行A.setB(b0),b0不是从数据库中取出的数据生成的对象,也会出现此错误。个人觉得应当减少这种依赖关系,在A类中可以用B类的id等唯一标识作为索引建立关联。
2.java.lang.AbstractMethodError: Method org/apache/commons/dbcp/DelegatingPreparedStatement.setCharacterStream(ILjava/io/Reader;J)V is abstract
对简单用例bookshop做更改后,将Category类替换成Users类,除了类中方法略有不同以及类名以外没有任何差别,然而替换后报上述错误。
解决方法很简单,只要把相关依赖commons-dbcp版本改成1.4即可(原来使用的是2003版本)
3.使用spring+hibernate+ajax前后端通讯时无法获取数据
常见的错误有几个:
404错误:ajax访问的地址和spring映射的地址不匹配
400错误:ajax传递的参数和springcontroller接受参数不匹配(尤其是传递对象时会出现较多问题),如果传多个对象,这些对象的属性有同名情况,就必须分开使用别名传输,然后在controller层做一次对象封装,再交给service
500错误:很莫名的错误
没有错误:遇到的最头疼的是前端不报错,后端不报错,debug不报错,但是数据就是传不过来,怎么传都是空
spring+hibernate从数据库获取表的记录,并按照字段依次返回给ajax。
debug过程从service层到controller层获取到的实体对象user的所有属性都已经获取到值了,但是将对象转换为json传递后,ajax无法接受数据的某一个字段(其他字段都能接收,但是有一个字段始终为空),反复纠结之后经过老板提醒才发现是domain实体中的该字段没有设置getter和setter方法,导致hibernate做对象转json时无法对该字段赋值,但是却不报错。以后值得注意的一点,实体类新建好后就要立刻设全getter和setter方法。
4.项目启动时报错:[No Spring WebApplicationInitializer types detected on classpath]
原本项目做得好好的,忽然某一天早上,在没有任何改动的情况下出现此错误。网上的解决方案99%是针对没有正确配置web.xml的。但是这种错误因为之前运行得好好的,不可能是配置错误。
解决方法:(1)使用mvn clean(2)把spring项目从tomcat中移除,再重新加入即可解决
hi!