Hibernate主键生成策略的验证之Increment

来源:互联网 发布:网络发彩信 编辑:程序博客网 时间:2024/06/04 00:41

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>
----------------------------------------------------------------------------------------------------------------------
测试类 这里只写方法就可以了
// 测试主键生成策略
@Test
public 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状态

214946880.png

下断点,启动测试。

214949979.png

当前只有一个线程运行,看下图蓝线出


214954581.png


接下来F6到下一行,在看图 蓝线出已经变了

214958400.png


此时不往下运行,退出debgu模式,再开一个debug线程第二个线程出现


215003203.png


F6往下一行

215005765.png


此时两个线程都拿到相同的id=2准备往数据库中插入数据了

215008819.png

选择一个继续往下运行,结束线程

215012852.png


查看DB数据 黑宋江已经插入数据了

215012892.png

结束还没有结束的线程出错了 数据没插进去 主键重复

215015332.png

DB还是刚刚的状态

215015508.png


这里可以查看一下DB中的建表语句,证实一件事情,就是id字段是由hibernate自己维护的,并不是DB生成的。看

215015860.png

id字段没有自增设置吧。
OK,完毕!
0 0
原创粉丝点击