Hibernate主键生成策略的验证之Increment
1. 完成配置,准备好环境。
hibernate.cfg.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration>
<!-- Hibernate中数据库的连接是通过Session来实现的 --><session-factory>
<!-- 数据库连接配置 --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url"> jdbc:mysql:///hbm3</property><property name="connection.username">liwei</property><property name="connection.password">liwei</property>
<!-- 配置数据库方言 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 常用属性 --><!-- 控制台显示sql --><property name="hibernate.show_sql">true</property><!-- 格式化sql --><property name="hibernate.format_sql">true</property>
<!-- 自动根据类生成DDL 表 完成自动建表 --><!--create 会删掉原有表和数据 然后新建一张表并且把数据做进去create-drop 会在程序运行结束时候把表删了update 如何类的映射发生了变化,不会改变原有的列,在数据表中增添新的列validate 只负责校验当前的表结构和映射是否一致,如果不一致就抛出异样。不会更新表结构.
--><property name="hibernate.hbm2ddl.auto">update</property><!-- 事务是否自动提交 --><property name="hibernate.connection.autocommit">false</property><!-- 在核心配置文件中加载模型映射文件 --><mapping file="src/com/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>-----------------------------------------------------------------------------------------------------------------------------Customer.hbm.xml<?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>
<!-- 实体映射文件 -->
<class name="com.Customer" table="Customer" catalog="hbm3">
<id name="id" column="id" type="int"><generator class=" increment" /></id><property name="name" column="name" type="java.lang.String" /><property name="age"><column name="age" sql-type="int"></column></property><property name="city" column="city" type="string" />
</class>
</hibernate-mapping>----------------------------------------------------------------------------------------------------------------------测试类 这里只写方法就可以了// 测试主键生成策略@Testpublic void demo2(){
Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();Customer customer = new Customer();customer.setAge(23);customer.setCity("山东");customer.setName("黑宋江");session.save(customer);transaction.commit();session.close();
}DB状态下断点,启动测试。当前只有一个线程运行,看下图蓝线出接下来F6到下一行,在看图 蓝线出已经变了此时不往下运行,退出debgu模式,再开一个debug线程第二个线程出现F6往下一行此时两个线程都拿到相同的id=2准备往数据库中插入数据了选择一个继续往下运行,结束线程
查看DB数据 黑宋江已经插入数据了 结束还没有结束的线程出错了 数据没插进去 主键重复DB还是刚刚的状态
这里可以查看一下DB中的建表语句,证实一件事情,就是id字段是由hibernate自己维护的,并不是DB生成的。看
id字段没有自增设置吧。
OK,完毕!