PostgreSQL串行类型的Hibernate注释

时间:2010-02-02 12:26:52

标签: java hibernate postgresql

我有一个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类中访问它们。

请帮忙。

4 个答案:

答案 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;
}

它适用于我。