很久没写这个博客了,囧~今天试了一下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的返回吧