`

Batch update returned unexpected row count from update [0]; actual row count: 0;

阅读更多
先把配置文件放上来:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
          
  <hibernate-mapping package="com.lj.zhang">
  	<class name="Order" table="test_order">
  			<id name="id">
  				<generator class="native"/>
  			</id>
  			 <property name="name" column="test_name"/>
  			
  		
		<many-to-one name="user" class="com.lj.zhang.User" column="customer_id"></many-to-one>
  			
  	</class>
  
  
  </hibernate-mapping>
          


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
          
  <hibernate-mapping package="com.lj.zhang">
  	<class name="User" table="test_user">
  			<id name="id">
  				<generator class="native"/>
  			</id>
  			
  			
  			<property name="name" type="string" length="40" column="test_name"/>
  			 
  			  
  			
  			
  		
  			<set name="orders" cascade="save-update" inverse="true">    
  				
  				<key column="customer_id"></key>
  				<one-to-many class="com.lj.zhang.Order"/>
  			</set>
  			
  	</class>
  
  
  </hibernate-mapping>



Main代码:
package com.lj.zhang;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;

import util.HibernateUtil;

public class HibernateTest4
{
	@SuppressWarnings({ "unused", "unchecked" })
	public static void main(String[] args)  
	{
		 

		Session session = HibernateUtil.openSession();

		Transaction tx = null;

		tx = session.beginTransaction();

 	//	Query query = session.createQuery("from User");
 

		// List<User> list=query.list();
		 
		 User u=new User(1,"alleni");
		 
		 Order o1=new Order(1,"o1",u);
		 
		 Order o2=new Order(2,"o2",u);
		 
		 Set<Order>orders=new HashSet<Order>();
		 orders.add(o1);
		 orders.add(o2);
		 
 	 
	//	 session.save(o);
		 
	
		 u.setOrders(new HashSet<Order>());
		 u.getOrders().add(o1);
		 u.getOrders().add(o2);
		 
		 session.save(u);

		tx.commit();
		
		session.close();
		
 

	}
}



         
         
     
         
在运行之前, 数据库里面是没有任何相关的数据的。 当transaction.commit()的时候, hibernate会执行     

Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into test_user (test_name, id) values (?, ?)
Hibernate: update test_order set test_name=?, customer_id=? where id=?

这里很意外的执行了一条update语句, 然后报错。
在网上找到了解决方案, 不过还是看了一下源码,想看看问题究竟出在哪里。可惜
没找到,但是学习到了一点点源码。。
解决方案 :http://hi.baidu.com/shirdrn/item/2fd8bc0abc8bc56ed45a11af


---------------------------------------





在ActionQueue里面有这个executeActions()方法,
它对所有的dml相关的内容进行执行操作。

	private void executeActions(List list) throws HibernateException {
		for ( Object aList : list ) {
			execute( (Executable) aList );
		}
		list.clear();
		session.getTransactionCoordinator().getJdbcCoordinator().executeBatch();
	}


下个图是关于这些list参数的, 可以看到, 我们的Order对象, 原本是应该被插入到数据库里并和User实现级联的,可是这里却被直接放入了updates的集合中。
结果就出发了update的sql语句。









==========================================
当把Order的id生成方式改成
<generator class="assigned"/>
Order对象便被放入了inserts集合对象中, 最终也就触发了insert语句的执行。
仅仅改变了一个identifier的生成方式就导致这样, 到底是为什么?



  • 大小: 85.8 KB
  • 大小: 147.2 KB
分享到:
评论

相关推荐

    Spring JdbcTemplate.batchUpdate 例子

    `JdbcTemplate`的`batchUpdate`方法就是用来实现这样的功能,它可以批量执行更新语句,如INSERT、UPDATE或DELETE。 `batchUpdate`方法的基本使用如下: ```java int[] result = jdbcTemplate.batchUpdate( ...

    batchupdate

    sqlhelper工具,batchupdate方法

    Hibernate错误及解决办法集合

    **问题描述**:执行Hibernate查询语句时,系统提示`Unknown column 'notice0_.myPublishDate' in 'field list'`错误。 **可能原因**:该错误表示Hibernate尝试从数据库中查询一个不存在的字段,通常是由于实体类...

    mysql-batch:小批量运行大型MySQL UPDATE和DELETE查询,以防止表行级锁定

    安装 pip3 install mysql_batchUPDATE示例您可以使用可用的模式运行此示例以下示例与以下更新相同: UPDATE batch_test SET date = NOW() WHERE number &gt; 0 . 2 AND date is NULL ; 这等效于以20行为批处理此更新: ...

    Acount_batch.rar_acount_batch

    标题"Acount_batch.rar_acout_batch"暗示我们正在处理一个与账户管理和批量处理相关的软件工具,其核心是一个批处理脚本(Acount_batch.bat)。批处理是Microsoft Windows操作系统中的一种脚本编写方式,允许用户...

    mybatis执行批量更新batch update 的方法(oracle,mysql两种)

    在MyBatis中,批量更新(batch update)是一种提高数据库操作效率的重要手段,尤其是在处理大量数据更新时。这里我们将详细探讨如何在Oracle和MySQL数据库中使用MyBatis进行批量更新。 1. **Oracle数据库的批量更新...

    cia转cci工具:Batch CIA 3DS Decryptor.zip

    "Batch CIA 3DS Decryptor.zip" 是一个专门用于批量处理CIA转CCI的工具包,它包含了所需的所有组件。 首先,我们来看一下这个压缩包内的文件: 1. **Batch CIA 3DS Decryptor.bat**:这是一个批处理脚本,用户可以...

    ibatis应对批量update

    executor.update("test.batchUpdate", item); } executor.executeBatch(); return null; } } ); } } catch (Exception e) { // 处理异常 } ``` 5. **注意事项**: - 确保数据库驱动支持批量更新功能。 -...

    The Definitive Guide to Spring Batch, 2nd Edition.epub

    The Definitive Guide to Spring Batch takes you from the “Hello, World!” of batch processing to complex scenarios demonstrating cloud native techniques for developing batch applications to be run on...

    word-count-spring-batch-partitioning:使用 Spring Batch 在 PDF 文件中实现计数词遵循 MasterSlave 模型

    word-count-spring-batch-partitioning 使用 Spring Batch 在 PDF 文件中实现计数词遵循 Master/Slave 模型主/从模型字数统计算法设置、构建和运行初始化数据库创建用于存储 word-count 和 word-count-repository 的...

    Batch Normalization:Accelerating Deep Network Training

    **批量归一化(Batch Normalization):加速深度网络训练** 在深度学习领域,Batch Normalization是一种被广泛采用的技术,其主要目标是通过减少内部协变量漂移(Internal Covariate Shift),来加速神经网络的训练...

    bank-spring-batch:具有多处理器的Spring Batch项目

    【Spring Batch简介】 Spring Batch是Spring框架的一个模块,专门用于处理批量处理任务。它提供了一套强大、可扩展且易用的工具,用于处理大量数据的读取、处理和写入操作。Spring Batch的设计目标是解决企业级批量...

    Delphi_3_recive_send_batch_simple_sms_

    function SendSimpleSMS(const usernamepassword:string;to_: ArrayOfString;fromtext: string; const isflash: Boolean): ArrayOfString;function SendSimpleSMS2(const... const count: Integer): ArrayOfMessagesBL;

    batch_decision_tree_决策树计算_决策树_batch_影像数据_

    本主题主要关注批量决策树(Batch Decision Tree)的计算及其在影像数据中的应用。 决策树算法基于一系列规则对数据进行分割,通过构建树状结构来做出预测或决策。在遥感领域,决策树可以用来解析影像数据,如识别...

    doc转chm工具:Batch DOC TO CHM Generator v2009.1.106.1341

    《批量DOC转CHM生成器:Batch DOC TO CHM Generator v2009.1.106.1341》 在信息技术领域,文档的格式多种多样,每种格式都有其特定的用途和优势。例如,DOC是Microsoft Word的默认文档格式,广泛用于文本编辑和排版...

    core-data-batch-update:核心数据 NSBatchUpdateRequest Swift 实现

    print("Error during batch update: \(error)") } } ``` 四、与常规更新比较 常规更新通常涉及加载对象到内存,修改属性,然后保存回磁盘。这种方法在处理少量数据时是可行的,但当数据量大时,内存消耗和效率...

    微软内部资料-SQL性能优化3

    Byte 0: Flag – 0x00 Byte 1: Resource Type – 0x07 (Key) Byte 2-3: DBID – 0x0005 Byte 4-7: ObjectID – 0x 75D7831F (1977058079) Byte 8-9: IndexID – 0x0001 Byte 10-16: Hash Key value – 0x 02014F0...

    Batch,Batch,Batch":What does it really mean?

    Batch,Batch,Batch":What does it really mean? 对渲染中dc的消耗的讲解

    Applying S88 batch control from a user's prspective .pdf

    从给定的文件信息来看,本文主要涉及S88批处理控制的知识,并且是从使用者的视角来探讨。S88批处理控制标准由国际测量和控制学会(ISA)提出,旨在提供一个通用的批处理控制系统设计、实施和操作的框架,主要被应用...

    windows update batch

    一个把指定目录下所有windows更新文件自动安装的小工具,省着自己一个个去点更新文件了,这个软件比批处理文件好的一点就是批处理文件还要手动去添加路径和文件,这个不用制定一个目录后自动查找系统还没有安装过的...

Global site tag (gtag.js) - Google Analytics