Hibernate 中的主键生成
来源:互联网 发布:java求二进制方法 编辑:程序博客网 时间:2024/06/05 18:07
很久没写这个博客了,囧~今天试了一下hibernate里面插入数据,使用currentSession,挺简单的方式:
@Transactional @Override public Integer save(UserEntity user) { Integer in = (Integer) currentSession().save(user); return in; }
但是后来发现返回的id一直都是0,并不是想象中递增的id,而数据库中插入的id确明明是递增的,所以查了一下发现Hibernate还需要定义id 增长的方式:
- Assigned:有程序生成主键值,在save之前指定,否则会抛出异常。
特点:主键由用户指定,与顶层数据库无关,用户需要维护主键值,在调用save方法前指定主键,
注意:有程序指定主键,如果是int类型的属性不指定值默认会自动增长 (Integer等封装类型都需要指定属性值)。 - Hilo:使用高地位算法生成主键
特点:需要二外表支持,能保证同一数据库中主键的唯一性,当不能保证多个数据库之间主键的唯一性,由hibernate维护与底层数据库无关。
注意:不能手动修改,否则会抛异常。 - Increment:对主键采取自增的方式生成新的主键,需要底层数据库支持Sequence,如Oracle、DB2。
特点:hibernate本身维护,适用于所有数据库。
注意:不适合于多并发的数据库,适合单一进程访问,不能用于集群环境。 - Identity: 根据底层数据库来支持自动增长,不同数据库用不同的增长方式。
特点:与底层数据库有关,适用MySQL、DB2、MSSQL,适用long、int、short类型生成唯一标识。
注意:hibernate和用户干涉,适用非常方便,但是程序在不同数据库上移植比较麻烦。 - Sequence:需要底层数据库支持Sequence方式,如Oracle数据库等特点:需要底层数据库支持序列,支持的数据库有Oracle、PostgreSql、DB2、SAPDb等。
注意:在不同数据库之间移植,特别是不支持序列的数据库上,需要修改配置文件。 - Native:生成方式会根据底层不同的数据库选择Identity、Sequence、Hilo主键生成方式。
特点:更具不同的底层数据库采用不同的生成方式,hibernate会更具底层数据库采用不同的映射方式。
注意:在项目中如果采用多个数据库时,可以使用这种方式,方便程序移植。 - uuid:使用128位uuid算法生成主键,保证网络环境下主键唯一,也能保证不同数据库不同服务器下主键唯一。
特点:能够保证数据库中主键唯一,生成的朱主键占用比较多的存储空间。
注意:必须是一个字符串类型的,长度必须大于32.
之后就是配置生成策略的方法,网上查到的很多教程都是使用XML,但是我更偏向于使用annotation,因此查了相关的配置方式,主要参考 这篇文章 ,最后使用了Identity的生成方式:
@javax.persistence.Column(name = "id", nullable = false, insertable = true, updatable = true, length = 10, precision = 0) @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public int getId() { return id; }
具体其他的生成方式后面还要继续研究,不过也突然想到合成组件之所以必须是可序列化的,也是用于save的返回吧
0 0
- Hibernate 中的主键生成
- Hibernate中的主键生成策略
- Hibernate中的主键生成策略
- 常用的hibernate中的主键生成策略
- Hibernate映射文件中的主键生成方式
- Hibernate中的主键生成策略简介
- Hibernate映射文件中的主键生成方式
- Hibernate主键生成方式
- Hibernate 主键生成方式
- hibernate主键生成策略
- hibernate主键生成方式
- Hibernate主键生成方式
- Hibernate 主键生成方式
- Hibernate 主键生成方式
- Hibernate主键生成方式
- Hibernate 主键生成方式
- Hibernate主键生成方式
- Hibernate 主键生成策略
- jetty学习1-SelectChannelConnector
- Smartphone 应用程序安全与代码签名模型开发人员实用指南
- 以MAD为例学习ENVI编程
- Android 自定义SeekBar控件
- Jetty6控制/通讯主要源代码分析
- Hibernate 中的主键生成
- 高手速成android开源项目【View篇】
- Cstyle的札记,flash及MTD,第0篇
- 数据结构 -- 单链表之删除节点
- jetty的SelectChannelConnector分析
- OJ 笔记:每一步都尽可能优化
- OJ笔记:测试小技巧
- 默认构造函数
- 谷歌眼镜GDK开发指南之触控手势