Hibernate之主键的映射

来源:互联网 发布:java程序员桌面壁纸 编辑:程序博客网 时间:2024/06/11 13:49

1、该实例的准备工作请看:http://write.blog.csdn.net/postedit/48010949

===========标识符生成器之assigned=================================

2、在src建立com.hibernate.test2包,并建立User.java,User.hbm.xml.

package com.hibernate.test2;
public class User {
    private int id;
    private String name;
    private int age;
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }

//此处省略get、set方法,但在实际的程序编写中一定要写

}

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-8-30 20:38:16 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.hibernate03.test.User" table="USER">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="age" type="int">
            <column name="AGE" />
        </property>
    </class>
</hibernate-mapping>

USER的sql创建语句为:create table USER(id int(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20),age int(11),primary key (id))ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf-8;

3,将User.hbm.xml加入到hibernate.cfg.xml中,并编写测试代码

第一种测试方式:

package com.hibernate.test2;
import static org.junit.Assert.*;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
public class Test1 {
    @Test
    public void test() {
        Session session=HibernateUtil.getSessionFactory().openSession();
        Transaction tx=session.beginTransaction();
        User u=new User();
        u.setAge(21);
        u.setName("mrw");
        session.save(u);
        tx.commit();
        session.close();
    }
}

运行结果为:

删除数据,并将测试代码改为:

第二种测试方式:

    public void test() {
        Session session=HibernateUtil.getSessionFactory().openSession();
        Transaction tx=session.beginTransaction();
        User u=new User();
        u.setId(100);
        u.setAge(21);
        u.setName("mrw");
        session.save(u);
        tx.commit();
        session.close();
    }

运行结果为:

===>assigned:完全由java程序代理生成

=============标识符生成器之increment======================================================

4、沿用第3步骤中的内容,将<generator class="assigned" />改为<generator class="increment" />

第一种测试方式运行结果为:

Hibernate输出的SQL语句如下:

Hibernate: select max(ID) from USER
Hibernate: insert into USER (NAME, AGE, ID) values (?, ?, ?)

第二种测试方式运行结果如下:

Hibernate输出的SQL语句如下:

Hibernate: select max(ID) from USER
Hibernate: insert into USER (NAME, AGE, ID) values (?, ?, ?)

==>increment:Hibernate自动递增生成标识符,将忽略java程序所传入的主键值

===========标识生成符之identity==========================================================

5、沿用第3步骤中的内容,将<generator class="assigned" />改为<generator class="identity" />

第一种测试方式运行结果为:


此处id为101,因为刚才插入过一条id为100的数据,即使删除了还是接着上一次的id之后

第二种测试方式运行结果如下:


此处id为102,因为刚才插入过一条id为101的数据,即使删除了还是接着上一次的id之后,并非是100==>identity:由底层数据库生成标识符,将忽略java程序所传入的主键值

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

本例仅对Hibnate的这三种标识生成符讨论,对于其他标识生成符,可参照该实例或其它方法学习





0 0
原创粉丝点击