面试题——Hibernate的主键生成策略

4.2主键生成策略
            在<id>元素中通过 <generator class="生成策略"></generator>指定数据表主键生成策略  常用的生成策略有六种
        4.2.1    increment
                increment 标识符生成器由 Hibernate 以递增的方式为代理主键赋值
            原理: select max(id)  from customer  insert max(id)+1
            ***使用Increment创建表 没有主键自增长 通过Hibernate在程序中内部完成自增长
            ***好处是可以跨平台 缺点 高并发访问 可以出现主键的冲突  模仿两个线程同时并发
            适用范围
                    由于 increment 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统
                    适用于只有单个 Hibernate 应用进程访问同一个数据库的场合
                    OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常

        4.2.2  identity (Mysql)
                identity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型(加1带走)
            原理:依赖数据库内部增长  和Hibernate无关
            **创建表 not null auto_increment
            **优点无需程序处理 数据库自己完成主键的增长 缺点mysql支持  oracle不支持
            ***没有线程并发问题
            适用范围:
            由于 identity 生成标识符的机制依赖于底层数据库系统, 因此, 要求底层数据库系统必须支持自动增长字段类型.
                支持自动增长字段类型的数据库包括: DB2, Mysql, MSSQLServer, Sybase 等
            OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
        
        4.2.3  sequence----Oracle
                sequence  标识符生成器利用底层数据库提供的序列来生成标识符
            原理:依赖数据库序列的支持  和Hibernate无关
                oracle支持序列  mysql不支持序列
                序列的原理的:
                    create sequence customer_sq
                    insert into customer(id) values(customer_sq.nextval) 序列自动问
            适用范围:
                适用范围:
            由于 sequence 生成标识符的机制依赖于底层数据库系统的序列, 因此, 要求底层数据库系统必须支持序列. 支持序列的数据库包括: DB2 Oracle 等
            OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常

        
        4.2.4  native
            native 标识符生成器依据底层数据库对自动生成标识符的支持能力, 来选择使用 identity, sequence 或 hilo 标识符生成器.
            适用范围:
            由于 native 能根据底层数据库系统的类型, 自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发
            OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常    
        
        4,2.5  uuid
            UUid的主键 采用String类型主键
                数据生成32位字符串
                
        4.2.6  assigned
        前五种策略 都是代理主键的生成策略
        
            普通指定
                <id name="id" column="id">
                    <generator class="assigned"></generator>
                </id>
                适用对象时必须指定主键
            
            联合主键
                主键并不是唯一 主键可以有两个列组成 firestname +lastname
                Caused by: org.hibernate.MappingException: composite-id class must implement Serializable: com.guigu.model.Person
                
            查看建表语句  有联合主键信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值