首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA和Postgres序列预分配大小设置错误

JPA和Postgres序列预分配大小设置错误
EN

Stack Overflow用户
提问于 2014-06-01 13:57:45
回答 2查看 5.3K关注 0票数 5

由于顺序问题,我无法检查任何实体。我使用Glssfish 4、Postgres 9.3 + JPA + EJB3和Netbeans 8。

代码语言:javascript
复制
    Finest:   persist() operation called on: MyUser{id=null, email=a@e.it, password=test,         firstname=test, lastname=test, company=Test}.
    Finest:   Execute query ValueReadQuery(sql="select nextval('mom_seq_id')")
    Finest:   Connection acquired from connection pool [read].
    Finest:   reconnecting to external connection pool
    Fine:   select nextval(mom_seq_id)
    Finest:   Connection released to connection pool [read].
    Warning:   Local Exception Stack: 
    Exception [EclipseLink-7027] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ValidationException
    Exception Description: The sequence named [mom_seq_id] is setup incorrectly.  Its increment does not match its pre-allocation size.
at org.eclipse.persistence.exceptions.ValidationException.sequenceSetupIncorrectly(ValidationException.java:1604)
at org.eclipse.persistence.sequencing.StandardSequence.createVector(StandardSequence.java:96)
    ...

关于Postgres的顺序:

代码语言:javascript
复制
CREATE SEQUENCE my_seq_id
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 27
  CACHE 1;
ALTER TABLE my_seq_id
  OWNER TO postgres;
COMMENT ON SEQUENCE my_seq_id
  IS 'Sequence for autoincrement id on MyClass';

还有我的实体的一个摘录:

代码语言:javascript
复制
@Entity
@Table(name = "myuser")
@XmlRootElement
public class MyUser implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name="MYSEQ",
                   sequenceName="my_seq_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE,
                generator="MYSEQ")
@Basic(optional = false)
@Column(name = "id")
private Integer id;

有人能解释一下是怎么回事吗?谢谢

我解决了我的问题,但我不知道为什么!我看到allocationSize()的默认值是50:

代码语言:javascript
复制
package javax.persistence;

@Target(value = {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface SequenceGenerator {

    public String name();

    public String sequenceName() default "";

    public String catalog() default "";

    public String schema() default "";

    public int initialValue() default 1;

    public int allocationSize() default 50;
}

我已经更新了我的Postgres序列的increment_by值从1到50,现在它工作了!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-03 07:51:01

将增量的值从1更改为50为我的Postgres序列解决了这个问题。正如@unwichtich所建议的那样,通过@SequenceGenerator注释指定allocationSize=50属性是个好主意。

票数 4
EN

Stack Overflow用户

发布于 2014-06-02 06:28:50

出于超出我理解的原因,JPA规范选择50作为序列生成器的默认增量。

PostgreSQL默认为1

如果两者不匹配,事情就变得很糟糕,因为JPA认为它可以使用其他人认为他们已经分配的值。至少EclipseLink检测到了这一点;Hibernate只是继续愉快地尝试重用已经分配的密钥。

如果你的顺序是:

代码语言:javascript
复制
CREATE SEQUENCE my_seq_id
  INCREMENT 1

那么您的映射必须反映这一点:

代码语言:javascript
复制
@SequenceGenerator(name="MYSEQ",
                   sequenceName="my_seq_id", allocationSize=1)

我强烈建议明确说明增量,即使您将其保留在默认的50中,而改为更改PostgreSQL序列。它将在稍后调试时保存您和其他人的理智。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23980612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档