Hibernate主键生成器

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "src/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<!--class 元素代表持久化类-->
    <!--name属性为类的全名-->
    <!--table 表名,默认值是类名-->
    <!--catalog 数据库的名字-->
    <class name="com.sanmao.hibernate.crud.domain.Person">
        <!--id为主键元素-->
        <!--name 标识符属性-->
        <!--length 数据库中pid 的长度-->
         <!--column    pid 属性对应的字段-->
        <id name="pid" length="5" column="pid" type="java.lang.Long">
            <!--主键的产生器-->
            <!--需要什么样的方式产生主键-->
            <!--<generator class="increment"></generator>-->
            <!--<generator class="assigned"></generator>-->
            <!--identity要求数据库中表的主键要自增长-->
            <generator class="identity"></generator>
            <!--<generator class="uuid"></generator>-->
        </id>
        <!--sequences-->
        <!--<id name="id" type="long" column="person_id">-->
            <!--<generator class="sequence">-->
                <!--<param name="sequence">person_id_sequence</param>-->
            <!--</generator>-->
        <!--</id>-->
        <!--代表一般的属性-->
        <property name="name" length="20"></property>
        <property name="sex" length="20"></property>
    </class>
</hibernate-mapping>
主键生产器中increment 与identity的区别,
increment是先查询表中最大值,加一就是下一个的主键,identity是按照数据库表中
的主键的自增长,所以用到identity ,数据库必须要支持自增长,所以increment 速度要比
identity 慢,但是主键连续,而identity连续被删除后,之后就不再连续
public class HibernateUtil {
    //将重复代码块进行封装
    public static SessionFactory sessionFactory;
    static {
        Configuration configuration=new Configuration();
        configuration.configure();
        sessionFactory=configuration.buildSessionFactory();
    }
}
package com.sanmao.hibernate.generator.test;

import com.sanmao.hibernate.crud.domain.Person;
import com.sanmao.hibernate.generator.test.utils.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

/**
 * 主键生成器
 */
public class GeneratorTest extends HibernateUtil {
    /**
     *
     * Hibernate: select max(pid) from Person
     *Hibernate: insert into Person (name, sex, pid) values (?, ?, ?)
     * 1.先查询该表中主键的最大值
     * 2.把最大值加1作为新的主键
     * 这种情况下主键必须是数字类型
     * increment
     * 尽管通过程序设置主键的值,也不起作用
     * */
    @Test
    public void testIncrement(){
        Session session=sessionFactory.openSession();
        Transaction transaction=session.beginTransaction();
        Person person=new Person();
        person.setName("chaochao");
        person.setSex("man");
        session.save(person);
        transaction.commit();
        session.close();
    }
/**
 * assigned
 * 该策略必须通过程序设置
 * 自己设置参数
 * */
    @Test
    public void testassigned(){
        Session session=sessionFactory.openSession();
        Transaction transaction=session.beginTransaction();
        Person person=new Person();
        person.setPid(1L);
        person.setName("chaochao");
        person.setSex("man");
        session.save(person);
        transaction.commit();
        session.close();
    }
    /**
     * 利用数据库的表的主键的自动增长设置
     * Identity
     *  identity要求数据库中表的主键要自增长
     * 否则会报错(表不支持的错误)
     * */
    @Test
    public void testIdentity(){
        Session session=sessionFactory.openSession();
        Transaction transaction=session.beginTransaction();
        Person person=new Person();
        person.setName("chaochao");
        person.setSex("man");
        session.save(person);
        transaction.commit();
        session.close();
    }
    /**
     * UUID
     * Hibernate 生成一串字符串
     * */
    @Test
    public void testUuid(){
        Session session=sessionFactory.openSession();
        Transaction transaction=session.beginTransaction();
        Person person=new Person();
        person.setName("chaochao");
        person.setSex("man");
        session.save(person);
        transaction.commit();
        session.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值