我正在使用Hibernate 3.3和PostgreSQL 8.并且希望使用Hibernate注释来映射一个非主键的自动递增列.

在Postgres中是否使用序列类型或序列映射列并不重要,只要它是由数据库自动递增的,而不是由Hibernate自动递增.我try 了以下映射,但它们总是生成空orderId.

@Column(name = "orderId", insertable = false)
@Generated(GenerationTime.INSERT)
//@GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)
private Integer orderId;

我将非常感谢您的帮助.

谢谢

推荐答案

以下映射应该可以正常工作:

@Column(name = "orderId")
@Generated(GenerationTime.INSERT)
private Integer orderId;

但是请注意,在刷新会话之前,新保存的对象的生成值不可用.

EDIT:请注意,这种映射不影响模式生成,但不会使Hibernate在模式生成期间创建类型为serial的列,因为Hibernate对数据库端的值生成的性质一无所知.因此,如果希望Hibernate创建具有适当类型的列,则需要显式指定它:

@Column(name = "orderId", columnDefinition = "serial")
@Generated(GenerationTime.INSERT)
private Integer orderId;

在最新的Hibernate版本(4.3)上,您可以使用:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long orderId;

Postgresql相关问答推荐

Keycloak和PostgreSQL

为什么Postgres在打印时能完全缩短时间跨度?

Postgres从spark触发post-write

为什么 Postgres 中的 now() 和 now()::timestamp 对于 CET 和 CEST 时区如此错误?

未更改表上的 Postgres 环绕预防

将数组的所有元素循环到jsonb中并修改值

在 postgresql 中查找表的所有依赖项

Postgresql如何从jsonB列的数组中的多个json中 Select 一个值

Postgis 不只使用索引扫描

在 KnexJS 中插入

表或列名不能以数字开头?

错误:syntax error at or near "user"

如果 Column1 不为空,则按 Column1 排序,否则按 Column2 排序

Sidekiq - 无法在 5.000 秒内获得数据库连接

从 Select 中创建一个临时表,如果表已经存在则插入

在不存在的行上有select for update块

子查询的自连接

PostgreSQL 中的行编号

如何减少存储(缩减)我的 RDS 实例?

如何为 Postgresql 中的所有数据库创建具有只读权限的用户?