发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA

求助hibernate问题

2007-04-20 11:37
赞助商链接

初次用hibernate3.0做项目,在测试过程中竟然发现一个对象有不同内容,而且是无规则的交替出现,猜想是hibernate缓存了出现问题。在查看数据库数据,结果正确,但不明白hibernate更新数据数据时,既然已经将数据提交给数据库,为什么缓存里的旧对象不更新,而且再缓存个新对象。
hibernate用session.delete(o)删除对象,在transaction.commit()时出现删除0个对象的异常。
以上是一对多关联关系测试时出现的问题,其中lazy=“false” cascade=“all”。
请各位指点。

2007-04-20 22:12

不清除你是如何操作的。能否写出业务流程?而且是否当时有其它程序或用户访问数据库?其它访问是否也是通过Hibernate?如果是多用户的话,有可能是因为并发造成的问题。
你使用的是一级缓存还是开了二级缓存?二级的用的什么缓存?

2007-04-21 11:40

不清除你是如何操作的。能否写出业务流程?而且是否当时有其它程序或用户访问数据库?其它访问是否也是通过Hibernate?如果是多用户的话,有可能是因为并发造成的问题。

你使用的是一级缓存还是开了二级缓存?二级的用的什么缓存?


我没有开二级缓存,也没有并发访问系统。仔细查看了一下程序,发现有一处的session没有关闭造成。即使时hibernate查找一级缓存的数据,但应当取得的数据应当是唯一的,为什么会出现新旧数据交替出现?

源程序是这样的:
public Model browseModel(int id,Class model) throws Exception, StsException {
DbAccessService dbAccess= new DbAccessService();
Model m= (Model) dbAccess.get( model, new Integer(id));
//dbAccess.close();//HSessionFactory.closeSession();
return m;
}

dbAccess.get() 封装的是return HSessionFactory.getSession().get(arg0, arg1);


下面是对一个多对多关系删除操作:
public void deleteModel(int id,Class model) throws Exception, StsException {
DbAccessService dbAccess= new DbAccessService();
dbAccess.beginTransaction();
Model m=(Model)dbAccess.get(model, new Integer(id));
System.out.println("m.id======="+m.getId());
m.removeRelateModel();//解除关联关系
//if(m.removeRelateModel()){
// //dbAccess.update(m);
// dbAccess.flush();
// }
//dbAccess.delete(id, model); dbAccess.deleteModel(m); //session().delete(model);
dbAccess.commit(); //Session().getTransaction().commit();
dbAccess.close();
}

上面程序在执行dbAccess.commit();时抛出异常
Could not synchronize database state with session
org.hibernate.StaleStateException: Unexpected row count: 0 expected: 1
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:27)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2291)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2440)

我使用的是sqlserver数据库。
从出错情况看是没有删除数据对象时产生的,但是数据对象存在的。

不知道该怎么解决,只好用下面这种方式:
//if(m.removeRelateModel()){
// //dbAccess.update(m);
// dbAccess.flush();
// }
//dbAccess.delete(id, model);

谁知道这是什么缘故,该怎么解决?

2007-04-21 12:24

谁知道这是什么缘故,该怎么解决?


上面程序在执行dbAccess.commit();时抛出异常
Could not synchronize database state with session
org.hibernate.StaleStateException: Unexpected row count: 0 expected: 1
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:27)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2291)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2440)

我使用的是sqlserver数据库。
从出错情况看是没有删除数据对象时产生的,但是数据对象存在的。

不知道该怎么解决,只好用下面这种方式:
//if(m.removeRelateModel()){
// //dbAccess.update(m);
// dbAccess.flush();
// }
//dbAccess.delete(id, model);

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系反馈 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com