H2数据库做单测数据库时踩到的坑

H2数据库用来做单测数据库,可以自定义初始化数据,不用担心数据库内容更改造成单测跑不过问题,不过H2数据库跟实际使用的Mysql还是有一定区别。

1. H2数据库不支持Mysql的批量更新功能,支持批量插入

--批量更新(H2不支持)
  <update id="increaseBatch"  parameterType="java.util.List">
        <foreach collection="list" item="item" index="index" open="" close="" separator=";">
            update product
            <set>
                quantity = quantity + #{item.updateQuantity}, modify_time = #{item.modifyTime}
            </set>
            where id = #{item.productId}
        </foreach>
    </update>

--批量插入(H2支持)
<insert id="insertItems" keyProperty="id" parameterType="java.util.List" useGeneratedKeys="true">
        <selectKey keyProperty="id" order="AFTER" resultType="long">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO bill_item(
        bill_id,product_id,product_name,product_quantity,product_quantity_after,product_price,product_amount)
        VALUES
        <foreach close="" collection="list" index="index" item="item" open="" separator=",">
            (
            #{item.billId},#{item.productId},#{item.productName},#{item.productQuantity},
            #{item.productQuantityAfter},#{item.productPrice},#{item.productAmount})
        </foreach>
    </insert>

2. H2数据库不支持Mysql的replace into 语法

3. H2数据库初始化时不允许出现相同的UK

    <jdbc:embedded-database id="dataSource" type="H2">
        <jdbc:script location="classpath:H2_TYPE.sql"/>
        <jdbc:script location="classpath:INIT_TABLE.sql"/>
        <jdbc:script location="classpath:INIT_DATA.sql"/>
    </jdbc:embedded-database>

INIT_TABLE.sql

-- 表A
CREATE TABLE `table_A` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自增主键‘,
  `bill_no` varchar(45) DEFAULT NULL COMMENT ‘单号‘,
  `bill_type` tinyint(4) unsigned NOT NULL DEFAULT ‘0‘ COMMENT ‘单据类别‘,
  `created_time` datetime NOT NULL DEFAULT ‘1000-01-01 00:00:00‘ COMMENT ‘创建时间‘,
  `modify_time` datetime NOT NULL DEFAULT ‘1000-01-01 00:00:00‘ COMMENT ‘修改时间‘,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_bill_type_bill_no` (`bill_type`,`bill_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

--表A
CREATE TABLE `table_B` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自增主键‘,
  `bill_no` varchar(45) DEFAULT NULL COMMENT ‘单号‘,
  `bill_type` tinyint(4) unsigned NOT NULL DEFAULT ‘0‘ COMMENT ‘单据类别‘,
  `created_time` datetime NOT NULL DEFAULT ‘1000-01-01 00:00:00‘ COMMENT ‘创建时间‘,
  `modify_time` datetime NOT NULL DEFAULT ‘1000-01-01 00:00:00‘ COMMENT ‘修改时间‘,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_bill_type_bill_no` (`bill_type`,`bill_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

运行结果:

Caused by: org.h2.jdbc.JdbcSQLException: Constraint "uk_bill_type_bill_no" already exists;
SQL statement:CREATE TABLE `table_B` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自增主键‘,
  `bill_no` varchar(45) DEFAULT NULL COMMENT ‘单号‘,
  `bill_type` tinyint(4) unsigned NOT NULL DEFAULT ‘0‘ COMMENT ‘单据类别‘,
  `created_time` datetime NOT NULL DEFAULT ‘1000-01-01 00:00:00‘ COMMENT ‘创建时间‘,
  `modify_time` datetime NOT NULL DEFAULT ‘1000-01-01 00:00:00‘ COMMENT ‘修改时间‘,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_bill_type_bill_no` (`bill_type`,`bill_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

原文地址:https://www.cnblogs.com/selinamee/p/9429529.html

时间: 2024-10-07 20:22:35

H2数据库做单测数据库时踩到的坑的相关文章

互联网级监控系统必备-时序数据库之Influxdb集群及踩过的坑

上篇博文中,我们介绍了做互联网级监控系统的必备-Influxdb的关键特性.数据读写.应用场景: 互联网级监控系统必备-时序数据库之Influxdb 本文中,我们介绍Influxdb数据库集群的搭建,同时分享一下我们使用集群遇到的坑! 一.环境准备 同一网段内,3个CentOS 节点,相互可以ping通 3个节点CentOS配置Hosts文件,相互可以解析主机名 Azure 虚拟机启用root用户 influxdb-0.10.3-1.x86_64.rpm 设置端口8083 8086 8088 8

backbone.js初体验--构建简单分页应用时踩到的坑

最近突然想接触下之前没有接触过的领域,单页应用,正巧之前也是刚刚学习了requirejs的用法,所以趁热打铁选择了很多网站采用的requirejs+underscorejs+backbonejs+jquery(zepto)的方式来进行demo的编写. 这篇文章主要不是介绍怎么去构建一个分页效果的,也不会去讲述backbone的基础知识,而是分享在我构建分页效果时候踩到的一些坑. 1. collection不是必须的 首先,我在开始写的时候就陷入了一个问题,事实证明我真的是多虑了,就是不该用col

那些年我用awk时踩过的坑——awk使用注意事项

由于项目经历原因,经常使用awk处理一些文本数据.甚至,我特意下载了一个windows上的awk:gawk.exe,这样在windows上也能享受awk处理数据的方便性,. 俗话说,"常在河边走,哪能不湿鞋",使用awk过程中碰上过不少坑,这里稍总结一下,希望对大家有帮助. 1 FS问题 看看这两个awk脚本: cat demo_1.txt demo_2.txt 1|2|3|4| 1|@|2|@|3|@|4|@| awk -F '|' '{print $2}' demo_1.txt;

前端开发工具Brackets介绍,安装及安装Emme插件时踩过的坑

对于前端开发的园友来说有可能IDE工具有很多,层次不穷,还有每个人的喜好及习惯也不一样,因为我是一名后端开发的.Net程序员,但是大家都知道,现在都提倡什么全栈工程师,所以也得会点前端开发,所以我对于前端来说可能是个菜鸟,大神绕过,勿喷!我刚接触程序,开发网站时主要用Dreamweaver,后来也用过WebStorm和Sublime2,不过在学习Bootstrap3的时候偶然的机会接触到Brackets就个人比较喜欢他,就不想用别的IDE了,我这里不做这些工具的比较,说哪一个更好,我觉得各有所爱

[转] 那些在使用webpack时踩过的坑

用webpack的过程,就是一个不断入坑和出坑的过程.回望来时路,一路都是坑啊!现把曾经趟过的那些坑整理出来,各位看官有福了~ 文章末尾有我用到的依赖的版本信息,若你发现某个问题与我在本文中的描述不一致时,可以看看是否版本与我所使用的不同所致. 一.Mac平台和Windows平台的差异导致的问题 1.路径上的差异 在配置entry选项的时候,我这么配置: entry: { main: __dirname + '/src/index.js' } 这样写在Mac下完全没有问题,但在Windows下会

使用Intellij IDEA创建Spring/SpringMVC/Hibernate项目时踩到的坑

1. 使用IDEA新建工程时,左侧选择Spring分类,右侧选择子类别的时候:可以先用着用于生成web.xml, dispatcher-servlet.xml, applicationContext.xml以至hibernate.cfg.xml.但是新建好了之后推荐Add Framework: Maven,不要使用那些Spring的Library,因为会出现潜在的jar库不兼容的问题.比如某些版本的Spring Data中的CurdRepository中的save接口函数和某些Spring Da

配置tomcat时踩过的坑

conf/server.xml文件有2处地方容易踩坑: 1.<HOst>标签中的appBase名字,要看清,有些修改的版本,会把这个名字改成deploy,而eclipse默认部署的是webapps这个文件夹. 2.<Connector>标签中的 port 这个值要注意,默认会是8080,不注意用80去试的话,会发现一直打不开网页.

各种报错,搭建Mysql MHA高可用集群时踩的各种坑

mha下载地址,需要翻墙 https://code.google.com/p/mysql-master-ha/ 管理软件 mha4mysql-manager-0.52-0.noarch.rpm 节点软件 mha4mysql-node-0.52-0.noarch.rpm 环境介绍 Centos6.7 X64 192.168.30.210 monitor 192.168.30.211 db1 (master) 192.168.30.212 db2  (备master) 192.168.30.213 

python与C,在写程序时踩过的坑!

1.  python与C有很多相似之处, 其一就是指针的大量应用,  因此在使用临时变量保存数据, 并将临时变量传递给其他变量时需要创建内存; 例如,在C中, char *temp 每次获取到不同的字符串, 依次放入 char **list中,    先申请一块内存  char *f = malloc(sizeof(char)*10);  f=temp; *list = f;    这样temp在改变时, 就不会影响到list: 下一个 *(list+1)=.. python中使用复制申请内存,