知道美河 | 上传资料 | VIP申请 | 精品课程 | 资料搜索 | 问题反馈 | 会员手册 | 积分消费 | 积分充值 | 帐号保护
美河学习学习在线赞助VIP

美河学习在线(主站) eimhe.com

 找回密码
 建立账号
查看: 11386|回复: 12

[咨询] 关于hibernate中的update

[复制链接]
发表于 2006-12-30 17:11:50 | 显示全部楼层 |阅读模式
最近在用stuts和hibernate做个项目,其中在用hibernate做update的时候碰到了点问题
public void updataUser(Integer id,String email,String password,String address,String tel,String name)
     {
            try
            {
                    Session session=HibernateSessionFactory.currentSession();
             
             Transaction tx = session.beginTransaction();
             Storeuser user= (Storeuser)session.load(Storeuser.class,id);
             user.setEmail(email);
             user.setPassword(password);
             user.setAddress(address);
             user.setTel(tel);
             user.setName(name);
             session.update(user);
             //session.flush();
             tx.commit();
            // session.close();
            }
            catch(Exception e)
            {
                    e.printStackTrace();
                    System.out.println("updateUser error!");
            }
             HibernateSessionFactory.closeSession();
     }


action里面:public ActionForward execute(
                ActionMapping mapping,
                ActionForm form,
                HttpServletRequest request,
                HttpServletResponse response) {
                UserUpdataForm userUpdataForm = (UserUpdataForm) form;
                // TODO Auto-generated method stub
                User u1 = new User();
                Storeuser su = new Storeuser();
                su.setEmail(userUpdataForm.getEmail());
                su.setAddress(userUpdataForm.getAddress());
                su.setPassword(userUpdataForm.getPassword());
                su.setName(userUpdataForm.getName());
                su.setTel(userUpdataForm.getTel());
                u1.updataUser(id,email,address,tel,password,name);
                System.out.print("success");
                return mapping.findForward("path");
        }

}

由于我的表中,id是pk,是设为native的..,自动增长的,测试后更新不了.请问高手应该怎么解决
发表于 2006-12-30 17:59:17 | 显示全部楼层
update在hibernate3.0中用merge方法代替。更新是说 把原来持久化的 对象从新加入内存。把find的结果修改叫update,3.0叫merge。这是我的看法啊。楼主用2.1啊?

[ 本帖最后由 eclipse 于 2006-12-30 18:10 编辑 ]
发表于 2006-12-30 18:50:15 | 显示全部楼层
你把你的异常发出来让大家看看

[ 本帖最后由 sashao 于 2006-12-30 18:55 编辑 ]
发表于 2006-12-30 19:02:28 | 显示全部楼层
发表于 2006-12-30 20:36:36 | 显示全部楼层
1,session.load() 得到的是对象的引用,并没有产生持久化的对象----虽然有对象标识,但是没有纳入到session 的管理
2,user.set()  ---产出持久对象--持久的(Persistent)状态

至此 session 回自动持久化对象状态到数据库
即使不调 save 或update方法,在tx.commit()时,session也会保存他的更新到数据库。

楼主的表是否有其他关联关系?打出debug来

[ 本帖最后由 sidneyren 于 2006-12-30 21:03 编辑 ]
发表于 2006-12-30 20:41:21 | 显示全部楼层
直接      tx.commit() 即可,不需save或update

[ 本帖最后由 sidneyren 于 2006-12-30 21:05 编辑 ]
 楼主| 发表于 2006-12-30 21:49:15 | 显示全部楼层
我就一张表..如下:"

[color=Red]id是pk,native,[/color]
其中我是想对这张表中的用户做update,但是写如下语句:
public void updataUser(String email,String password,String address,String tel,String name)
     {
            try
            {
                    Session session=HibernateSessionFactory.currentSession();
             
             Transaction tx = session.beginTransaction();
           
            Storeuser user = new Storeuser();
             user.setEmail(email);
             user.setPassword(password);
             user.setAddress(address);
             user.setTel(tel);
             user.setName(name);
             session.update(user);
             session.flush();
             tx.commit();
             session.close();
            }
            catch(Exception e)
            {
                    e.printStackTrace();
                    System.out.println("updateUser error!");
            }
             HibernateSessionFactory.closeSession();
     }
但实际上执行的是查入一条新数据,我想知道到底怎么写才能对原有数据进行更新.
 楼主| 发表于 2006-12-30 22:00:42 | 显示全部楼层
org.hibernate.TransientObjectException: The given object has a null identifier: com.lang.model.Storeuser
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.getUpdateId(DefaultSaveOrUpdateEventListener.java:225)
        at org.hibernate.event.def.DefaultUpdateEventListener.getUpdateId(DefaultUpdateEventListener.java:46)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:212)
        at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:33)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
        at org.hibernate.impl.SessionImpl.update(SessionImpl.java:499)
        at org.hibernate.impl.SessionImpl.update(SessionImpl.java:490)
        at com.lang.daos.User.updataUser(User.java:98)
        at com.lang.struts.action.UserUpdateAction.execute(UserUpdateAction.java:61)
        at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
        at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
        at com.lang.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:38)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:793)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:702)
        at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:571)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644)
        at java.lang.Thread.run(Thread.java:534)
updateUser error!

[ 本帖最后由 wotiancai 于 2006-12-30 22:03 编辑 ]
发表于 2006-12-31 09:03:01 | 显示全部楼层
public Storeuser findById( java.lang.Integer id) {
        log.debug("getting Storeuser instance with id: " + id);
        try {
            Storeuser instance = (Storeuser ) getSession()
                    .get("com.lang.model.Storeuser ", id);
            return instance;
        } catch (RuntimeException re) {
            log.error("get failed", re);
            throw re;
        }
    }   

public void save(Storeuser transientInstance) {
        log.debug("saving Storeuser instance");
        try {
            getSession().save(transientInstance);
            getSession().flush();
            log.debug("save successful");
        } catch (RuntimeException re) {
            log.error("save failed", re);
            throw re;
        }
    }


这个是MyEclipse自动生成的。你可以参考下。。呵呵。。。
发表于 2006-12-31 09:06:07 | 显示全部楼层
先取出来然后对需要更新的属性进行更新。最后save。就搞定。。

可能还有别的简单方法。。本人经验有限。。。。

大家还有别的方法拿出来一起交流吧。。。

The given object has a null identifier
这是你的异常。如果要update当然需要先取出该数据啊。你直接new个新的怎么update啊。。。

[ 本帖最后由 adamed 于 2006-12-31 11:29 编辑 ]
 楼主| 发表于 2006-12-31 14:04:03 | 显示全部楼层
多谢楼上的。.终于把这个问题搞明白了..原来是这样啊,呵呵.现在终于能update了

public boolean updateUser(Storeuser user)
     {
            // boolean flag=true;
           
   
                    Session session =HibernateSessionFactory.currentSession();
           
             Transaction tx = session.beginTransaction();
             Query query = session.createQuery("from Storeuser user where user.username='" +
                               user.getUsername() + "'");
           
         Storeuser temp = (Storeuser)query.list().get(0);
         
         temp.setName(user.getName());
         temp.setAddress(user.getAddress());
         temp.setEmail(user.getEmail());
         temp.setPassword(user.getPassword());
         temp.setTel(user.getTel());
         session.update(temp);
         System.out.print("!!!");
         tx.commit();
         session.close();
         HibernateSessionFactory.closeSession();
         return  tx.wasCommitted();
发表于 2006-12-31 16:34:37 | 显示全部楼层
发表于 2009-4-8 12:28:56 | 显示全部楼层
您需要登录后才可以回帖 登录 | 建立账号

本版积分规则

 
QQ在线咨询

QQ|小黑屋|手机版|Archiver|美河学习在线 ( 浙网备33020302000026号 )

GMT+8, 2025-5-2 18:59

Powered by Discuz!

© 2001-2025 eimhe.com.

快速回复 返回顶部 返回列表