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就能删除

试想,hibernate封装了jdbc,而jdbc是通过普通的sql去操作数据表的。如果hibernate想要操作数据库,必然也要转化成相应的sql才能实现。有没有想过,在hibernate的配置中,为什么必须要告诉hibernate一个javabean对应的表是哪个,哪个属性又对应了这张表的主键。显然,当hibernate执行类似于delete、update、save等操作时,是根据传入参数的类,来查找对应要操作的表,然后根据id,来执行sql的。执行的真正sql,应该是delete from 表 where 对象.getId(),显然除了那个对象外,其它的信息都可以通过配置来得到,所以,只要你传入一个对象,而这个对象的主键对应属性不为空,就可以操作对应的数据。

而执行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语句,就完成了删除操作。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-02
你删除这个链接是传到 struts 中 delete 其中delete重定向到user对象 其中它含有 id这个成员变量 所以就能删除了
第2个回答  2013-04-02
因为id是这张表中唯一标识的啊。。所以传入一个id就能删除整条user数据啊

ssh框架删除更新问题
或者加载User实体,调用session.delete(user);删除 更新 HQL:update User as u set u.pwd = ? where u.name = ?或者加载User实体,setPwd()后调用session.update(user);更新 用实体的话,通过Hibernate获得实体的时候属性就是已经填好的,只需要通过set方法改变相应的值后update即可。

SSH报错问题
hibernate是ORM对象关系映射框架,只能针对对象操作的!所以你在后面getHibernateTemplate().delete(id);,只是删除一个对象的属性是不对的喔。第一个方法,其实是调用了两个方法。第一:getHibernateTemplate().get(User.class, id)相当于:User user1 =getHibernateTemplate().get(User.class, id);getH...

SSH批量删除的问题 jsp往action里面传参数的时候有问题
SSH批量删除的问题 jsp往action里面传参数的时候有问题 5 我在jsp页面上获取到了id拼成的字符串,id之间以#分开,之后触发下面这个js函数。现在的状态是alert可以弹出且内容正确,但是下面IdString就是传不过去,如果我把<%=Ids%>改成一个已知... 我在jsp页面上获取到了id拼成的字符串,id之间以#分开,之后触发下...

ssh 删除数据成功但是数据库里面的数据还在
事务好像是在spring里面配的,一个声明式事务,一个编程式事务。没听说过全局事务。在声明事务里面配好后就不会再有事物的问题了呀。

ssh框架,jsp跳转acion,在action取id值问题?
你配好struts.xml,在deleteAction类里面定义一个id的变量,生成对应的setter和getter方法,这样传递过去的时候底层会调用setter方法设置id变量,也可以用 ServletActionContext.getRequest().getParameter();获得传递的参数。一般用第一种就行的,struts.xml应该会配吧,不行就google下这是struts最基本的。

ssh删除更新问题 高分
SQLQuery sqlQuery = session.createSQLQuery(sql.toString());HibernateDaoSupport这个父类有 getSession()这个方法的。或者 Session session = getHibernateTemplate().getSessionFactor().openSession();也可以。不要老知道说SSH,要理解好它们的意义,这些不是一定要整合用的,要看实际需求,而且它们都有...

尚学堂王勇ssh中structs中客户维护系统例子疑问,为什么删除按钮没作 ...
if (!flag) { alert("请选择需要删除的用户!");return;}这后面使用alert弹出框来一步一步测试,慢慢找下执行到哪里出错了。JS调试初学时比较困难,慢慢调试就好。有什么疑问可以HI我。

华三交换机怎么删除local user不会有什么影响吧
1、你用console线登陆是否需要输入用户名和密码?如果不需要那你可以用concole下登陆后将原来的用户删除掉,或者你讲用户下的密码修改都可以,不影响网络业务;2、无法用web方式管理可能是创建的local-user没有允许web服务,你在service-type下看是除了telnet、ssh是否有web?3、设备升级需要下载升级包,...

在SpringMvc的Controller里写一个根绝id删除对象的操作怎么写
Controller负责事物处理和页面的跳转,根据id删除对象,那你把id传到Controller里然后再用dao操作就行了,页面可以form表单提交或者 href链接带参数提交

SSH 删除方法为int 返回值怎么弄
返回的 int 类型的值只是说明此操作影响了多少条的记录,如果没有需要的话,可以不对其返回值进行处理,也就是直接将方法定义为 void 即无返回值的即可,如需获取返回值,定义一个 int 类型的变量如count,再使用 count = this.getHibernateTemplate().delete(ui);即可 ...

相似回答