mysql saveorupdate_saveOrUpdate为什么不能智能处理???

首先,数据库表是空的,在程序里调用saveOrUpdate方法,产生的sql语句却是 update user set user_name=?, real_name=?, password=?, sex=?, birthday=?, email=?, address=?, telephone=?, qq=?, authority=?, remarks=?where user_id=?这样当然会出错,明明数据库根本没有数据,为什么执行的是修改

表结构

CREATE TABLE USER(

user_id INT PRIMARY KEY NOT NULL,//不是自增       user_name VARCHAR(30),

real_name VARCHAR(20),

PASSWORD VARCHAR(20),

sex VARCHAR(3),

birthday VARCHAR(30),

email VARCHAR(40),

address VARCHAR(50),

telephone VARCHAR(20),

qq VARCHAR(15),

authority VARCHAR(50),

remarks VARCHAR(50)

配置入下

xx.hbm.xml

================================================

调用方法源码 hibernate本身的org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdateAll

public void saveOrUpdateAll(final Collection entities) throws DataAccessException {

executeWithNativeSession(new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException {

checkWriteOperationAllowed(session);

for (Object entity : entities) {

session.saveOrUpdate(entity);}

return null;

}

});

================================================

错误日志

22 11:31:28,668 [http-8080-2] ERROR org.hibernate.event.def.AbstractFlushingEventListener- Could not synchronize database state with session

org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1

at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:92)

at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:78)

at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)

at org.hibernate.jdbc.BatchingBatcher.addToBatch(BatchingBatcher.java:33)

at org.hibernate.persister.entity.BasicEntityPersister.update(BasicEntityPersister.java:1982)

at org.hibernate.persister.entity.BasicEntityPersister.updateOrInsert(BasicEntityPersister.java:1909)

at org.hibernate.persister.entity.BasicEntityPersister.update(BasicEntityPersister.java:2149)

at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:75)

at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)

at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)

at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:137)

at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)

at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)

at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)

at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:394)

at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)

at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdateAll(HibernateTemplate.java:707)

at com.flex.dao.impl.UserDAO.saveOrUpdateAll(UserDAO.java:68)

at com.flex.service.impl.IUserServiceImpl.saveOrUpdateAll(IUserServiceImpl.java:25)

at com.flex.web.UserAction.saveAll(UserAction.java:32)

at com.flex.web.UserAction.getAllUser(UserAction.java:23)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:418)

at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183)

at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1400)

at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:1005)

at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:103)

at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158)

at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44)

at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67)

at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:166)

at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:291)

at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:353)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

上面日志执行了user.setUserId(id),,数据库不是自增

在创建User这个对象时 不执行user.setUserId(id);这时生成的sql是插入语句,但是会出现如下错误

因为userid不能为空,数据库又不是自增的原因

2011-11-22 11:49:04,052 [http-8080-3] DEBUG org.hibernate.util.JDBCExceptionReporter- could not insert: [com.flex.model.User] [insert into user (user_name, real_name, password, sex, birthday, email, address, telephone, qq, authority, remarks) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]

java.sql.SQLException: Field 'user_id' doesn't have a default value

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3603)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3535)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1989)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2415)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2333)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2318)

at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1759)

at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2178)

at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:34)

at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)

at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:240)

at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:160)

at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:95)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:96)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)

at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:468)

问题补充:首先,数据库表是空的,在程序里调用saveOrUpdate方法,产生的sql语句却是 update user set user_name=?, real_name=?, password=?, sex=?, birthday=?, email=?, address=?, telephone=?, qq=?, authority=?, remarks=?where user_id=?这样当然会出错,明明数据库根本没有数据,为什么执行的是修改

表结构

CREATE TABLE USER(

user_id INT PRIMARY KEY NOT NULL,//不是自增       user_name VARCHAR(30),

real_name VARCHAR(20),

PASSWORD VARCHAR(20),

sex VARCHAR(3),

birthday VARCHAR(30),

email VARCHAR(40),

address VARCHAR(50),

telephone VARCHAR(20),

qq VARCHAR(15),

authority VARCHAR(50),

remarks VARCHAR(50)

配置入下

xx.hbm.xml

================================================

调用方法源码 hibernate本身的org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdateAll

public void saveOrUpdateAll(final Collection entities) throws DataAccessException {

executeWithNativeSession(new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException {

checkWriteOperationAllowed(session);

for (Object entity : entities) {

session.saveOrUpdate(entity);}

return null;

}

});

================================================

错误日志

22 11:31:28,668 [http-8080-2] ERROR org.hibernate.event.def.AbstractFlushingEventListener- Could not synchronize database state with session

org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1

at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:92)

at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:78)

at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)

at org.hibernate.jdbc.BatchingBatcher.addToBatch(BatchingBatcher.java:33)

at org.hibernate.persister.entity.BasicEntityPersister.update(BasicEntityPersister.java:1982)

at org.hibernate.persister.entity.BasicEntityPersister.updateOrInsert(BasicEntityPersister.java:1909)

at org.hibernate.persister.entity.BasicEntityPersister.update(BasicEntityPersister.java:2149)

at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:75)

at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)

at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)

at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:137)

at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)

at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)

at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)

at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:394)

at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)

at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdateAll(HibernateTemplate.java:707)

at com.flex.dao.impl.UserDAO.saveOrUpdateAll(UserDAO.java:68)

at com.flex.service.impl.IUserServiceImpl.saveOrUpdateAll(IUserServiceImpl.java:25)

at com.flex.web.UserAction.saveAll(UserAction.java:32)

at com.flex.web.UserAction.getAllUser(UserAction.java:23)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:418)

at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183)

at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1400)

at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:1005)

at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:103)

at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158)

at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44)

at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67)

at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:166)

at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:291)

at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:353)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

上面日志执行了user.setUserId(id),,数据库不是自增

在创建User这个对象时 不执行user.setUserId(id);这时生成的sql是插入语句,但是会出现如下错误

因为userid不能为空,数据库又不是自增的原因

2011-11-22 11:49:04,052 [http-8080-3] DEBUG org.hibernate.util.JDBCExceptionReporter- could not insert: [com.flex.model.User] [insert into user (user_name, real_name, password, sex, birthday, email, address, telephone, qq, authority, remarks) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]

java.sql.SQLException: Field 'user_id' doesn't have a default value

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3603)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3535)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1989)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2415)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2333)

at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2318)

at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1759)

at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2178)

at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:34)

at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)

at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:240)

at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:160)

at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:95)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:96)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)

at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:468)

问题补充:

wangyijiangshui 写道

你设置的持久化类的id生成器为native,

则默认 unsaved-value属性值为null,即对象user_id字段必须为null,hibernate才会看是否数据库中有对应记录,也就是判断是否是脱管管对象,如不存在相应记录,即瞬时对象,hibernate才执行保存,想让session.saveOrUpdate()执行save操作,必须将PO(你将要保存的对象)的id设为空。

那意思是说如果设为native那么id的产生只能交给数据库处理是吗?

如果我程序设置了id的值,那么hibernate就认为这条数据是在数据库存在的,对吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值