VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 904|回复: 5

关于hibernate中有联合主键表的更新问题,请求高手赐教!急!

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-24 14:00:01 | 显示全部楼层 |阅读模式
我现在用hibernate,想对一个有联合主键的表的某个字段进行更新,结果给我报异常:org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.persistent.Consumpatch#com.persistent.ConsumpatchId@68fd7db3]
我在线等!

我的方法如下:
public boolean updateGroup(int typeid,int producterid,int specid,String branchid){
                Session session=HibernateSessionFactory.currentSession();
                Transaction tx=session.beginTransaction();
                try{
                        ConsumpatchId conid=new ConsumpatchId();
                        conid.setTypeid(typeid);
                        conid.setSpecificid(specid);
                        conid.setBranchid(branchid);
                        conid.setConmpatchid(conid.getConmpatchid()+1);
                        Consumpatch cons=(Consumpatch)session.load(Consumpatch.class,conid);
                        cons.setProducerid(producterid);               
                        session.saveOrUpdate(cons);
                        session.flush();
                        tx.commit();
                }catch(HibernateException he){
                        if(tx!=null)
                                tx.rollback();
                        he.printStackTrace();
                        return false;
                }finally{
                        session.close();
                }
                return true;
        }
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-31 05:15:01 | 显示全部楼层
主键问题 自己仔细找找
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-1 11:00:01 | 显示全部楼层
ID已经存在啊,你模似题一下啊

public   boolean   updateGroup(int   typeid,int   producterid,int   specid,String   branchid){
Session   session=HibernateSessionFactory.currentSession();
Transaction   tx=session.beginTransaction();
try{
ConsumpatchId   conid=new   ConsumpatchId();

conid.setTypeid(typeid);
conid.setSpecificid(specid);
conid.setBranchid(branchid);
conid.setConmpatchid([color=#FF0000]conid.getConmpatchid()+1); [/color]
Consumpatch   cons=(Consumpatch)session.load(Consumpatch.class,conid);
cons.setProducerid(producterid);
session.saveOrUpdate(cons);
session.flush();
tx.commit();
}catch(HibernateException   he){
if(tx!=null)
tx.rollback();
he.printStackTrace();
return   false;
}finally{
session.close();
}
return   true;
}
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-1 11:30:01 | 显示全部楼层
楼主,你确定在你的数据库中有符合要求的记录吗?

从你的异常信息来看,是你的数据库中没有符合要求的记录。
在按主键查询而没有找到对应的记录时,程序将出现ObjectNotFoundException——这是load()方法的特点之一。

顺便提个建议:
把load()换成get()吧。get()的特点是在没找到对应记录时返回null,而不会抛异常。

所以,解决方案为:
[b]1、确定你的数据库中存在符合要求的记录
2、把load()换成get()[/b]
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-1 11:45:01 | 显示全部楼层
[接3楼]
突然又发现更严重的问题:楼主的代码有点不合逻辑。
如果你之前能够成功load(),说明记录是必然存在的。那么肯定是update了,何必又使用saveOrUpdate()?saveOrUpdate()内部还会按主键去查一次的,楼主你把自己陷入泥潭了……

如果你想saveOrUpdate(),说明你要插的记录可能存在也可能不存在,那之前的查询不但没有意义,而且必定带来异常:如果用load(),在记录不存在时将ObjectNotFoundException。如果使用get(),在记录不存在时返回null,则接下来会NullPointerException

所以,解决方案之补充:
[b]如果你是想saveOrUpdate(),那就应该把之前的查询去掉,直接new Consumpatch()并对其属性赋值,然后saveOrUpdate()。[/b]
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-1 12:00:01 | 显示全部楼层
ConsumpatchId   conid=new   ConsumpatchId();
conid.setTypeid(typeid);
conid.setSpecificid(specid);
conid.setBranchid(branchid);
conid.setConmpatchid(conid.getConmpatchid()+1);
楼主代码很有问题。先实例化一个conid,这时候是个空对象,conid.getConmpatchid(),这个方法你要不是空,要不就是0。想想你每次到这都取到什么,不行就直接用find不用load
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

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