求助hibernate问题

07-04-20 JonZhang

初次用hibernate3.0做项目,在测试过程中竟然发现一个对象有不同内容,而且是无规则的交替出现,猜想是hibernate缓存了出现问题。在查看数据库数据,结果正确,但不明白hibernate更新数据数据时,既然已经将数据提交给数据库,为什么缓存里的旧对象不更新,而且再缓存个新对象。

hibernate用session.delete(o)删除对象,在transaction.commit()时出现删除0个对象的异常。

以上是一对多关联关系测试时出现的问题,其中lazy=“false” cascade=“all”。

请各位指点。

wlmouse
2007-04-20 22:12

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

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

JonZhang
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);

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

JonZhang
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);