使用oracle序列与jpa(toplink)

时间:2011-09-24 09:13:08

标签: oracle jpa sequence toplink

我的oracle db中有一个序列对象:

create sequence BASE_SEQ
minvalue 1
maxvalue 9999999999999999999999999999
start with 100
increment by 1
nocache;

我在我的网络应用程序中使用jpa(toplink)。我有所有数据库对象的基类:

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

public class AbstractEntity implements Serializable {
    protected BigDecimal id;

    @javax.persistence.Column(name = "ID")
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BASE_SEQ")
    @SequenceGenerator(name="BASE_SEQ",sequenceName="BASE_SEQ", catalog = "DOF")
    public BigDecimal getId() {
        return id;
    }

此类由某些实体继承。在我开始我的应用程序,并将多个实体持久/合并到db之后,我可以发现,他们的PK以51开始(而不是预期的100)。

之后,我转到我的数据库,查看我的序列对象的DDL并看到它已被更改为:

create sequence BASE_SEQ
minvalue 1
maxvalue 9999999999999999999999999999
start with 101
increment by 1
nocache;

为什么会这样?我有一些PK 51,52等实体,序列以101开头。

AS - GlassFish 3.1.1

1 个答案:

答案 0 :(得分:1)

SequenceGenerator上的默认preallocationSize为50,它必须与您设置为1的序列增量相匹配。

将增量更改为50(推荐),或将preallocationSize更改为1(这将导致插入性能不佳)。