hibernate主键的生成器

10-主键的生成器

hibernate是根据映射文件的主键生成器生成主键哒,自己设置的主键不起作用

<!-- 主键的产生器,就该告诉hibernate容器用什么样的方式产生主键-->

<generator class="increment"></generator>

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
 
public class GeneratorTest extends ConfigUtil{
    /**
     * Hibernate: select max(pid) from Person
    Hibernate: insert into Person (pname, psex, pid) values (?, ?, ?)
    
    说明:
       1、主键的类型必须是数字
       2、主键的生成是由hibernate内部完成的,程序员不需要干预
       3、这种生成机制效率比较低
     */
    @Test
    public void testIncrement(){
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        
        Person person = new Person();
        person.setPname("班长3");
        person.setPsex("女");
        
        /**save的参数必须持久化对象*/
        session.save(person);
        
        transaction.commit();
        session.close();
    }
    
    /*
     * Hibernate: insert into Person (pname, psex) values (?, ?)
     * 说明
     *   1、新的主键的产生是由数据库完成的,并不是由hibernate或者程序员完成的
     *   2、该表必须支持自动增长机制
     *   3、效率比较高
     */
    @Test
    public void testIdentity(){
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        
        Person person = new Person();
        person.setPname("班长");
        person.setPsex("女");
        
        /**
         * 参数必须持久化对象
         */
        session.save(person);
        
        transaction.commit();
        session.close();
    }
    
    /**
     * 由程序员手写设置主键
     */
    @Test
    public void testAssigned(){
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        
        Person person = new Person();
                      person.setPid(4L);
        person.setPname("班长");
        person.setPsex("女");
        
        session.save(person);
        
        transaction.commit();
        session.close();
    }
    
    /**
     * 1、UUID是由hibernate内部生成的,主键的类型是String
     * 2、主键的类型必须是字符串
     */
    @Test
    public void testUUID(){
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        
        Person person = new Person();
        person.setPname("班长");
        person.setPsex("女");
        
        session.save(person);
        
        transaction.commit();
        session.close();
    }
    
    
    /**
     * hibernate内部是根据主键生成器来生成主键的,在客户端设置主键不一定起作用,在assigned的时候起作用
     */
    @Test
    public void testIdentity_ID(){
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        Person person = new Person();
        person.setPid(1L);
        person.setPname("aa");
        person.setPsex("aa");
        session.save(person);
        transaction.commit();
        session.close();
    }
}
时间: 2024-08-30 01:56:44

hibernate主键的生成器的相关文章

java框架篇---hibernate主键生成策略

Hibernate主键生成策略 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用) 数据库中的语法如下: MySQL:create table t_user(id int auto_increment

Hibernate主键生成策略总结(转)

Hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定关键字来告诉hibernate我们要使用的主键生成方式,然后hibernate会根据设定完成数据库的主键控制. 一.首先通过举例子来了解实体映射文件(*.hbm.xml)中对id生成策略配置格式 用户User的实体类User.java [java] view plaincopy package com.bjpowernode.hibernate; import java.util.Date; public class 

Hibernate 主键策略

Hibernate主键生成策略 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用) 数据库中的语法如下: MySQL:create table t_user(id int auto_increment

Hibernate主键生成策略(转)

1.自动增长identity 适用于MySQL.DB2.MS SQL  Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL  的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server  中很常用) 数据库中的语法如下: MySQL:create table t_user(id int auto_increment primary  key

160727、自定义hibernate主键生成策略生成字符串+数字自增长

需求:需要自增长注解如MyId0001.MyId0002.MyId0003 实现:实现这个接口org.hibernate.id.IdentifierGenerator 一.MyIdGenerator.java(测试用,实际项目中获取链接等可以改变) import java.io.Serializable; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import

hibernate主键生成策略值sequence

主键生成策略采用sequence,但没有指定具体的sequence的时候,Hibernate会访问一个默认的sequence,是hibernate_sequence,我们也需要在数据库中建立这个sequence xml文件配置,采用默认seq <id name="pkId" type="java.math.BigDecimal"> <column name="PK_ID" precision="22" sca

Hibernate主键生成策略strategy = &quot;increment&quot;报错违反唯一性约束

背景2018年7月份,系统爆出一条bug.就是支持Excel导入的功能,导入第二次同模板不同数据时,报错,违反唯一性约束.就死活用不了了,重启Tomcat才能恢复使用.但只能到一个文件 分析需要重启Tomcat,应该是缓存的原因 原因分析完所有代码,临时数据使用clear换成new,不行:内存使用监控,导入完模板,就恢复正常,不是:最后,看着异常找原因,发现Hibernate的主键策略是strategy = "increment" 尝试会不会是hibernate主键策略选择不正确,因为

Hibernate主键生成器

主键生成器负责生成数据表记录的主键:increment:为long,short或者int类型主键生成唯一标识.只有在没有其他进程往同一张表中插入数据时才能使用.在集群下不能使用! identity:在DB2,MySQL,Microsoft SQL Server,Sybase和HypersonicSQL等提供identity(自增长)主键支持的数据表中适用.返回的标识属性是long,short或int类型的 sequence:在DB2,PostgreSQL,Oracle,SAP DB,McKoi等

[转]hibernate主键生成策略

1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法应该尽量避免. <id name="id" column="id"> <generator class="assigned" /> </id&g