微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

H2 创建-删除模式下的唯一索引或主键冲突

如何解决H2 创建-删除模式下的唯一索引或主键冲突

我在 H2 数据库中有 3 个表,分别为 coursepapercourse_paper,在 application.properties 中配置了 create-drop 选项。每当我尝试通过 data.sql 将数据插入表时,我都会遇到唯一索引或主键冲突。下面是我的带有关系注释和 data.sql实体类。请提供一些解决方案或指导我解决此问题。

1:基础实体

@MappedSuperclass
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class BaseEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
}

2 : CourseEntity

@Entity
@Table(
        name = "course",uniqueConstraints = {
                @UniqueConstraint(columnNames = "id")
        }
)

@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
public class CourseEntity extends BaseEntity {

    @Column(name = "stream")
    private String stream;

    @Column(name = "name")
    private String name;

    @OnetoMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinTable(name = "course_paper",joinColumns = {@JoinColumn(name = "course_id",referencedColumnName = "id")},inverseJoinColumns = {@JoinColumn(name = "paper_id",referencedColumnName = "id")})
    private Set<PaperEntity> paperEntities;

    public CourseEntity(Course course) {
        this.setId(course.getId());
        this.setName(course.getName());
        this.setStream(course.getStream());
    }
}

3 : PaperEntity

@Entity
@Table(name = "paper",uniqueConstraints = {
                @UniqueConstraint(columnNames = "id")
        })
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class PaperEntity extends BaseEntity {

    @Column(name = "name")
    private String name;
    @Column(name = "symbolic_name")
    private String symbolicName;
 
    public PaperEntity(Paper paper){
        this.setId(paper.getId());
        this.setName(paper.getName());
        this.setSymbolicName(paper.getSymbolicName());
    }
}

4:data.sql

INSERT INTO `course` VALUES (1,'ARTS','+2 1St Year'),(2,'+2 2nd Year'),(3,'+3 1St Year'),(4,'+3 2nd Year'),(5,'+3 3rd Year'),(6,'SCIENCE',(7,(8,(9,(10,'+3 3rd Year');
INSERT INTO `paper` VALUES (1,'Pol.Science','Political Science'),'Eco','Economics'),'Math','Mathematics'),'Phy','Physics'),'Chem','Chemestry');
INSERT INTO `course_paper` VALUES(1,1),(1,2),2);

5:错误

Caused by: org.h2.jdbc.JdbcsqlIntegrityConstraintViolationException: Unique index or primary key violation: "PUBLIC.UK_HU9K94I7MTNKS4X0Y0207JBGG_INDEX_2 ON PUBLIC.COURSE_PAPER(PAPER_ID) VALUES 1"; sql statement:
INSERT INTO `course_paper` VALUES(1,2) 

解决方法

您具有从 @OneToManyCourseEntityPaperEntity 关系。 这意味着每篇论文最多只能被一门课程引用。

但在错误消息中您可以看到相同的 PAPER_ID 与两个课程组合在一起。 然后根据您的 JPA 实现基于您的实体注释生成的约束触发错误。

要解决此问题,请从插入语句中删除元组,以便每篇论文最多被引用一次,或者将一对多关系更改为多对多关系。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。