SSH框里简单删除问题!案例里传一个ID,delete方法里居然就能直接删除user了。是怎么实现的,好神奇
<s:iterator value="#userList" var="u">
<tr>
<td><s:property value="#u.id"/></td>
<td><s:property value="#u.name"/></td>
<td><s:property value="#u.password"/></td>
<td><s:property value="#u.dept.deptname"/></td>
<s:a href="user!delete?id=%{#u.id}">删除</s:a>
struts xml
<action name="user" class="userAction">
<result>/list.jsp</result>
<result name="add">/add.jsp</result>
<result name="addSuccess" type="redirectAction">user</result>
<result name="toUpdate">/update.jsp</result>
<result name="delete" type="redirectAction">user</result>
</action>
ACTION类
//删除
public String delete(){
userBiz.delete(user);
return "delete";
}
接着biz省略,直接daoImpl
//删除
public void delete(User user) {
this.getHibernateTemplate().delete(user);
}
完全没有看到user,居然传一个ID就能删除 展开
而执行update和save时则需要注意,如果你只想更新一个字段,而你new了一个对象,然后给这个字段赋值,执行update,此时其它字段都会被清空。这显然不是你想要的。所以update的时候,通常是从数据库load一个对象,然后给这个load到的对象的某个属性重新赋值,再去update,才能达到更新某一字段的效果。
多想想hibernate的某一配置是为了什么来配置的,能帮助你理解hibernate的原理。
id和user相关联 在哪里配置怎么配。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="tang.cms.entity.User" table="t_user">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="username"></property>
</class>
</hibernate-mapping>
上面是一个User.hbm.xml的配置文件。一般的列与属性的对应,使用的是property标签,如上面的username,但作为id是一个特殊的情况,所以它有专门的标签来标注。当执行delete的时候,你传入了一个对象,假设是User类的一个实例,hibernate就回去User.hbm.xml去查找关于User类的配置。
因为是删除,它会去找这个id标签,然后发现id标签的name值是id,这样的话,再反射去获取你传的对象的id属性的值,假设这个值为idval。然后继续去查找column属性,这个属性是对应的就是整个User类所对应的那张表的主键字段名,上面的查找结果就是,t_user表的主键是id,所以,它就可以确定,你要删除的是t_user表里的id值等于传入的那个对象的id值,也就是idval,转化成sql就是delete from t_user where id = idval。显然,如果要执行delete,需要取得几个关键属性。第一是从哪张表删除,这个可以根据参数对象的类型来判断,比如传入的是User类的实例,它就去User.hbm.xml中查找table属性,这里是t_user;第二是删除的依据是什么,也就是,一张表有那么多字段,哪个字段才是主键,这个从上面的分析可以得到,主键是id。而在表中删除一条数据,知道主键值就完全可以了,因为主键是唯一的,通过主键,可以确定删除的行。第三点就是,要删除的这条数据,它的主键值是多少。而这个值就在你传递的那个参数对象中,hibernate会通过反射,调用参数对象的get方法,取得这个值。最后,将以上数据代替到sql语句delete from table where 主键 = 主键值 中,执行这个sql语句,就完成了删除操作。