【问题标题】:Jpa Persist primary key restriction violationJpa Persist 主键限制违规
【发布时间】:2015-02-16 10:21:15
【问题描述】:

我在传递持久性方面遇到了一些问题。现在我尝试以更详细的方式描述我的问题。我有两个实体 Row 和 Field。

    @Entity
public class Row implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name="ROW_IMPORT_ID_GENERATOR", sequenceName="SEQ_RIGA_IMPORT")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ROW_IMPORT_ID_GENERATOR")
    private Long id;

    //bi-directional many-to-one association to CampoImport
    @OneToMany(mappedBy="row", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Field> fields;

    //Getters and setters method

    public void addField(Field fieldToAdd){

        if(fields==null)
            fields = new ArrayList<Fields>();

        fields.add(campoToAdd);
        fieldToAdd.setRow(this);

    }
}


@Entity
public class Field implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name="FIELD_IMPORT_ID_GENERATOR", sequenceName="SEQ_CAMPO_IMPORT")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="FIELD_IMPORT_ID_GENERATOR")
    private Long id;

    private String description;

    //bi-directional many-to-one association to RigaImport
    @ManyToOne
    @JoinColumn(name="ID_ROW")
    private Row row;

    //Getters and setters method
}

这是生成序列的sql语句:

CREATE SEQUENCE SEQ_RIGA_IMPORT INCREMENT BY 1 START WITH 1 MAXVALUE 999999999999999999 MINVALUE 1;

CREATE SEQUENCE SEQ_CAMPO_IMPORT INCREMENT BY 1 START WITH 1 MAXVALUE 999999999999999999 MINVALUE 1;

现在,当我尝试运行以下 sn-p 代码时:

Row rowToSave = new Row(some parameters);
Field fieldToSave = new Field( some parameters);
rowToSave.addField(fieldToSave);
rowRepository.save(rowToSave);

我收到此错误:

Internal Exception: java.sql.SQLException: ORA-00001: violated    restriction of uniqueness (BILL.FIELD_PK)

Error Code: 1
Call: INSERT INTO FIELD (ID, DESCRIPTION, ID_ROW) VALUES (?, ?, ?)
bind => [3 parameters bound]

我哪里做错了?

【问题讨论】:

  • 也许您有在使用序列之前创建的记录并且已经具有序列增量的 id ?
  • 你不是又在其他地方坚持这个领域了吗?当您保存该行时,该字段将“自动”保存,因此如果您将其保存在另一个地方,您将有双重插入(因为在您第一次保存时已经设置了 ID)。
  • 尝试设置日志记录以记录正在使用的参数:wiki.eclipse.org/EclipseLink/Examples/JPA/Logging 但我怀疑您的序列从 1 开始并以 1 递增是问题的原因。 JPA 默认递增 50,因此可能会尝试使用值 -49 到 1。设置序列 allocationSize 以匹配您的数据库序列对象
  • @Chris 你说 JPA 默认递增 50,因此可能尝试使用值 -49 到 1

标签: java jpa eclipselink


【解决方案1】:

您的数据库序列对象的分配大小为 1,而 JPA 默认为 50,这将导致此问题。设置您的分配大小以匹配。见https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Ids/SequenceGenerator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2019-04-29
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多