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 增长的方式:

  1. Assigned:有程序生成主键值,在save之前指定,否则会抛出异常。
    特点:主键由用户指定,与顶层数据库无关,用户需要维护主键值,在调用save方法前指定主键,
    注意:有程序指定主键,如果是int类型的属性不指定值默认会自动增长 (Integer等封装类型都需要指定属性值)。
  2. Hilo:使用高地位算法生成主键
    特点:需要二外表支持,能保证同一数据库中主键的唯一性,当不能保证多个数据库之间主键的唯一性,由hibernate维护与底层数据库无关。
    注意:不能手动修改,否则会抛异常。
  3. Increment:对主键采取自增的方式生成新的主键,需要底层数据库支持Sequence,如Oracle、DB2。
    特点:hibernate本身维护,适用于所有数据库。
    注意:不适合于多并发的数据库,适合单一进程访问,不能用于集群环境。
  4. Identity: 根据底层数据库来支持自动增长,不同数据库用不同的增长方式。
    特点:与底层数据库有关,适用MySQL、DB2、MSSQL,适用long、int、short类型生成唯一标识。
    注意:hibernate和用户干涉,适用非常方便,但是程序在不同数据库上移植比较麻烦。
  5. Sequence:需要底层数据库支持Sequence方式,如Oracle数据库等特点:需要底层数据库支持序列,支持的数据库有Oracle、PostgreSql、DB2、SAPDb等。
    注意:在不同数据库之间移植,特别是不支持序列的数据库上,需要修改配置文件。
  6. Native:生成方式会根据底层不同的数据库选择Identity、Sequence、Hilo主键生成方式。
    特点:更具不同的底层数据库采用不同的生成方式,hibernate会更具底层数据库采用不同的映射方式。
    注意:在项目中如果采用多个数据库时,可以使用这种方式,方便程序移植。
  7. 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
原创粉丝点击