我有一个PostgreSQL表,其中我将inv_seq
列声明为serial
。
我有一个Hibernate bean类来映射表。除此列外,所有其他列都已正确读取。这是Hibernate bean类中的声明:
....
....
@GeneratedValue(strategy=javax.persistence.GenerationType.AUTO)
@Column(name = "inv_seq")
public Integer getInvoiceSeq() {
return invoiceSeq;
}
public void setInvoiceSeq(Integer invoiceSeq) {
this.invoiceSeq = invoiceSeq;
}
....
....
声明是否正确?
我能够看到数据库中列生成的序列号,但我无法在java类中访问它们。
请帮忙。
答案 0 :(得分:2)
我发现当你将它设置为AUTO时,hibernate 3.6会尝试对所有实体使用单个序列,所以在我的应用程序中我使用IDENTITY作为生成策略。
@Id
@Column(name="Id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Craig对于需要递增的发票号码有一些非常好的观点,如果你将它们呈现给用户,他建议使用表格。如果您最终使用表来存储下一个ID,则可以使用与此类似的映射。
@Column(name="Id")
@GeneratedValue(strategy=GenerationType.TABLE,generator="user_table_generator")
@TableGenerator(
name="user_table_generator",
table="keys",
schema="primarykeys",
pkColumnName="key_name",
pkColumnValue="xxx",
valueColumnName="key_value",
initialValue=1,
allocationSize=1)
private Integer id;
答案 1 :(得分:1)
正确的语法如下:
@Column(name="idClass", unique=true, nullable=false, columnDefinition = "serial")
@Generated(GenerationTime.INSERT)
private Integer idClass;
答案 2 :(得分:0)
根据您的具体情况,这可能无效。针对Hibernate打开了一个记录此行为的错误。
http://opensource.atlassian.com/projects/hibernate/browse/HHH-4159
如果您愿意使用映射文件而不是注释,我可以重新创建问题(SERIAL列中的NULL不属于主键)。使用property元素的“generated”属性会导致Hibernate在插入后重新读取行以获取生成的列值:
<class name="Ticket" table="ticket_t">
<id name="id" column="ticket_id">
<generator class="identity"/>
</id>
<property name="customerName" column="customer_name"/>
<property name="sequence" column="sequence" generated="always"/>
</class>
答案 3 :(得分:0)
我在我的项目中使用Postgres + Hibernate,这就是我所做的:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "hibernate_sequence")
@SequenceGenerator(name = "hibernate_sequence", sequenceName = "hibernate_sequence")
@Column(name = "id", unique = true, nullable = false)
protected Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
它适用于我。