使用Hibernate注释映射PostgreSQL串行类型

时间:2011-02-12 18:16:50

标签: hibernate postgresql sequence auto-increment

我正在使用Hibernate 3.3和PostgreSQL 8.x,并希望使用Hibernate注释来映射不是主键的自动递增列。

如果使用SERIAL类型或Postgres中的序列映射列并不重要,只要它由数据库而不是Hibernate自动递增。我尝试了以下映射,但它们总是生成null orderId。

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

我将不胜感激任何帮助。

由于

5 个答案:

答案 0 :(得分:29)

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

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

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

编辑:请注意,这种映射不会影响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;

答案 1 :(得分:22)

接受的答案对我不起作用。

但是这样做了:

@Id
@Column(name = "your_id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer yourId;

答案 2 :(得分:4)

我在postgresql9.1中使用它,也应该使用8:

@SequenceGenerator(allocationSize=1, initialValue=1, sequenceName="account_id_seq", name="account_id_seq")
@GeneratedValue(generator="account_id_seq", strategy=GenerationType.SEQUENCE)
@Id
@Column(name="id")
private Integer id;

答案 3 :(得分:0)

数据库序列与您的私钥不同步。因此,您需要更新序列索引。

从db检查您的序列ID,然后执行此sql命令。 (别忘了备份您的数据库,以防万一)

SELECT setval('your_primary_key_sequence', (SELECT MAX(your_primary_key) FROM your_table)+1);

答案 4 :(得分:0)

我尝试了 GenerationTime.INSERTGenerationType.IDENTITY,但都没有阻止在更新 null 调用中插入 saveAll()

将字段标记为不可写以供休眠有什么帮助:

@Column(insertable = false, updatable = false)
private Integer orderId;

(感谢this answer