跳到主要内容

主键生成

PostgreSQL 常用 SERIALBIGSERIALIDENTITY 或 sequence 生成主键。前三者由数据库在 INSERT 时生成,dbVisitor 在写入后把主键值写回实体;sequence 也可以在 INSERT 前取值。

说明

通用配置见主键生成与回填

主键策略

策略本数据源的用法
手工赋值插入前由应用提供主键。
自增由数据库生成数值主键。
UUID字符主键使用 UUID32 或 UUID36。
序列插入前取得序列值。
自定义使用自定义生成器,在插入前或后处理主键。

使用 SERIAL / IDENTITY

CREATE TABLE user_info (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR(64),
age INTEGER
)

实体主键使用 KeyType.Auto

@Table("user_info")
public class UserInfo {
@Column(value = "id", primary = true, keyType = KeyType.Auto)
private Long id;

private String name;
private Integer age;
}

构造器 API 根据实体映射生成 INSERT,并把 PostgreSQL 返回的主键写回当前实体。

新增后属性自动回填
UserInfo user = new UserInfo();
user.setName("mali");
user.setAge(18);

LambdaTemplate lambda = ...;
int rows = lambda.insert(UserInfo.class)
.applyEntity(user)
.executeSumResult();

Long id = user.getId();
注意

Ignore 跳过的记录不会返回主键;处理已有记录的用法见插入冲突

使用序列

下面使用普通主键列和序列,与上面的自增列示例独立:

CREATE TABLE user_info (
id BIGINT PRIMARY KEY,
name VARCHAR(64),
age INTEGER
);
CREATE SEQUENCE user_info_id_seq START WITH 1 INCREMENT BY 1;
import net.hasor.dbvisitor.mapping.Column;
import net.hasor.dbvisitor.mapping.KeySeq;
import net.hasor.dbvisitor.mapping.KeyType;
import net.hasor.dbvisitor.mapping.Table;

@Table("user_info")
public class UserInfo {
@Column(primary = true, keyType = KeyType.Sequence)
@KeySeq("user_info_id_seq")
private Long id;
private String name;
private Integer age;

// 省略 getter 和 setter
}
UserInfo user = new UserInfo();
user.setName("mali");

lambda.insert(UserInfo.class)
.applyEntity(user)
.executeSumResult();

Long id = user.getId();

每次插入前自动获取序列值,赋给 id 后再写入记录。