最近在做江苏一家公司的面试题,本来只是一个简单的权限控制方面的题型。但我是一个完美主义者,硬是征求同意更改了需求,用ssh架构。做的整个过程中,遇了不少问题,虽然只是简单的增删改查。
user表如下:
create table user(
number int(11) NOT NULL auto_increment COMMENT '编号',
username varchar(20) not null,
password varchar(50) not null,
privilege varchar(10) not null COMMENT '员工,管理员,部门主任',
regtime date NOT NULL COMMENT '入职时间',
location varchar(20) NOT NULL COMMENT '位置',
contactman varchar(20) NOT NULL,
primary key (number),
UNIQUE KEY (username)
);
spring getHibernateTemplate().saveOrUpdate(obj)方法调用 hibernate session.saveOrUpdate(entity);
我只想更新除password之外的字段,但看打印的sql,saveOrUpdate(entity)聪明地把password=null。我很无语,为什么不能先判断一下,如果有为null的话,就不更新了。
本来我想按自己的思想,重新封装一下此方法的,但碍于项目进度,就先拼拼凑凑sql吧。
String hql = "update User set username = '" + tempUser.getUsername()
+ "' , privilege = '" + tempUser.getPrivilege()
+ "' , regtime = '" + tempUser.getRegtime()
+ "' , contactman = '" + tempUser.getContactman()
+ "' , location = '" + tempUser.getLocation()
+ "' where number =" + tempUser.getNumber();
int count = dao.update(hql);
也就是不更新password,但出现error
Hibernate: update User set username='f', privilege='管理员', regtime='Sat Dec 25 00:00:00 CST 2010', contactman='ff', location='fff' where number=27
2010-12-25 09:37:01 SQL Error: 0, SQLState: 22001
String2Date:------------2010-12-25----------------
String2Date:------------2000-01-01----------------
String2Date:------------2050-12-31----------------
java.util.Date=com.emp.util.DateConverter
DateConverter只是执行一次,也就是在validattion.xml 和set方法之前,那么Date2String,什么时候执行呢。会在调用get方法的时候吗?
this.contactman = user.getContactman();
// this.regtime = user.getRegtime();
换了一下,依然报错。我的设想很垃圾。呵呵。所以设想Date2String在get方法后执行,不然页面怎么会正常。
getHibernateTemplate().saveOrUpdate(obj),虽然把password=null了,但它的类型是正常的,我设想调用了Converter.怎么做到的呢。
我继续发现.........
补充:
我自己想错了。
hibernate本身有转换器,何必调用sturts2转换器。
不过,我还真遇到问题。
hql:里update 时,hibernate能把类型转换过来吗?似乎不能。这个时候,怎么办。我自己写转换方法的。这个实现太垃圾了。
还有saveOrupdate不好使时,我先load一下,然后set ,最后saveOrUpdate。成功了。
load()后应该是hibernate的xx态,既然讲得这么多的概念之一,相信肯定是hibernate做得成功的地方,先查找再插入效率上肯定也高。
这方面还得深入学习啊。。