我正在使用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;
我将不胜感激任何帮助。
由于
答案 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.INSERT
和 GenerationType.IDENTITY
,但都没有阻止在更新 null
调用中插入 saveAll()
。
将字段标记为不可写以供休眠有什么帮助:
@Column(insertable = false, updatable = false)
private Integer orderId;
(感谢this answer)