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

ale*_*wan 24 postgresql hibernate 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;
Run Code Online (Sandbox Code Playgroud)

我将不胜感激任何帮助.

谢谢

axt*_*avt 30

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

@Column(name = "orderId")
@Generated(GenerationTime.INSERT)
private Integer orderId;
Run Code Online (Sandbox Code Playgroud)

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

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

@Column(name = "orderId", columnDefinition = "serial")
@Generated(GenerationTime.INSERT)
private Integer orderId;
Run Code Online (Sandbox Code Playgroud)

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

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long orderId;
Run Code Online (Sandbox Code Playgroud)


pst*_*ton 22

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

这样做虽然:

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

  • **不**与奖金如何兼容? (2认同)

小智 5

我将它与 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;
Run Code Online (Sandbox Code Playgroud)

  • 如果没有@Id,这可以工作吗?(因为问题很明确,该字段不是 id 字段) (2认同)