Spring Boot参照完整性约束违规

时间:2018-05-15 10:49:41

标签: java hibernate spring-data-jpa entity-relationship hibernate-onetomany

一开始,我知道有很多关于stackoverflow的帖子,我已经尝试了我找到的每个解决方案。

我正在我的“ARTICLE”和“USER”表之间创建一个OneToMany关系 - 一个USER到多个文章。实体的代码如下(我也使用Lombok,因此@Getter和@Setter注释)。

ARTICLE:

@Entity
@Table(name = "ARTICLE")
@Getter
@Setter
public class Article extends BaseEntity {

    private String title;
    private String name;
    private String iconName;

    @ManyToOne
    @JoinColumn(name = "AUTHOR_ID")
    private UserItem author;

    private Long editorId;

    @Lob
    private String article;

}

USER:

@Entity
@Table(name = "USER")
@Getter
@Setter
@EqualsAndHashCode(callSuper = false, of = { "username", "company" })
public class UserItem extends BaseEntity {

    private String username;
    private String name;
    private String lastName;
    private String phone;
    private String password;
    private String company;
    private String reasonsForAccess;
    private Integer failLogins = 0;

    private boolean enabled = true;
    private boolean accountNonExpired;
    private boolean accountNonLocked;
    private boolean passwordNonExpired;
    private boolean credentialsNonExpired;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(
            name = "USER_TO_ROLE",
            joinColumns = @JoinColumn(
                    name = "USER_ID"),
            inverseJoinColumns = @JoinColumn(
                    name = "ROLE_ID"))
    private Set<RoleItem> roles;

    @ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)
    @JoinTable(
            name = "USER_ANSWER",
            joinColumns = { @JoinColumn(name = "USER_ID") },
            inverseJoinColumns = { @JoinColumn(name = "QUESTION_ANSWER_ID") }
    )
    Set<QuestionAnswerItem> answers = new HashSet<>();

    @OneToMany(mappedBy = "author")
    private Set<Article> articles;
}

我的程序使用data.sql文件初始化数据库。我在下面的片段中为上面的表添加了INSERT语句:

INSERT INTO PUBLIC.ARTICLE(ID, VERSION, ARTICLE, AUTHOR_ID, ICON_NAME, NAME, TITLE, EDITOR_ID) VALUES
(4, 0, 'clobclobyolo', 1, 'book', 'Introduction to 1, Consumer Place', 'one', null),
(5, 0, 'clobclobyolo', 1, 'mail', 'Email Solution (Digital Marketing Center)', 'one', null),
(6, 0, 'clobclobyolo', 1, 'glob', 'Global Registration System (GRS)', 'one', null),
(7, 0, 'clobclobyolo', 1, 'ticket', 'Ticketing Tool to drive CRM work (Service Now)', 'one', null),
(8, 0, 'clobclobyolo', 1, 'pie-chart', '1.Consumer Place Reporting', 'one', null),
(9, 0, 'clobclobyolo', 1, 'sms', 'SMS Solution', 'one', null),
(10, 0, 'clobclobyolo', 1, 'list', 'Driving trial through Brand Propensity Model', 'one', null),
(11, 0, 'clobclobyolo', 1, 'line-chart', 'Data Integration Capabilities', 'one', null),
(12, 0, 'clobclobyolo', 1, 'application', 'What is DMP, CRM and DMP better together', 'one', null),
(13, 0, 'clobclobyolo', 1, 'bar-chart', 'Data Source performance Tracking', 'one', null),
(14, 0, 'clobclobyolo', 1, 'facebook', 'Facebook Leads Campaigns', 'one', null),
(15, 0, 'clobclobyolo', 1, 'cloud-glob', 'Learn more about Data Enrichments', 'one', null);

INSERT INTO PUBLIC.USER(ID, VERSION, CREDENTIALS_NON_EXPIRED, ACCOUNT_NON_EXPIRED, ACCOUNT_NON_LOCKED, COMPANY, ENABLED, FAIL_LOGINS, LAST_NAME, NAME, PASSWORD, PASSWORD_NON_EXPIRED, PHONE, REASONS_FOR_ACCESS, USERNAME) VALUES
(1, 7, TRUE, TRUE, TRUE, 'lingaro', TRUE, 0, 'admin', 'admin', '$2a$11$TiefIbi6p15IAlGZsTIxquCNDrRCCjmzt9lTN0/D.toRFDVG3ECYO', TRUE, NULL, 'good', 'admin@mail.com'),
(2, 0, TRUE, TRUE, TRUE, 'lingaro', TRUE, 0, 'user', 'user', '$2a$10$GS4IiuO9ygrHOr2e.lFx4euYACa6ZENz52KmGx8l.WCEqH03.HPsO', TRUE, NULL, 'good', 'user@mail.com'),
(33, 4, TRUE, TRUE, TRUE, 'lingaroaaaaaaaa', TRUE, 0, 'admin', 'admin', '$2a$10$AJMuV2lAeg1XQoPIYQklju9t6aWyVrPMreXVOCaRgJhoxsp831Yhe', TRUE, NULL, 'good good', 'admin1'),
(97, 0, TRUE, TRUE, TRUE, 'PG', TRUE, 0, 'hu_ta', 'hu_ta', '$2a$10$3opTpBQkdbvt8AA1aEOaM.YyCHh98ODxsPBlQ6IrX23o9HxUDyALq', TRUE, NULL, 'Ping Federation', 'hu_ta'),
(161, 0, TRUE, TRUE, TRUE, 'PG', TRUE, 0, 'tatar.ht', 'tatar.ht', '$2a$10$iDfgmuKJI1YHRK4DKsm4mOZ/CdnE.5GoWYijEzdsdU/SnulJCHRYS', TRUE, NULL, 'Ping Federation', 'tatar.ht');

开始测试后,我遇到了“无法加载ApplicationContext”的异常,由于“参照完整性约束违规”而引发了异常。我只粘贴了堆栈跟踪的一个片段,因为它几乎都是一样的,只是不同的INSERT:

java.lang.IllegalStateException: Failed to load ApplicationContext

    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
    at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190)
    at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132)

...

Referential integrity constraint violation: "FKGWRTDBQVT9UCNTP82ND3YIUEC: PUBLIC.ARTICLE FOREIGN KEY(AUTHOR_ID) REFERENCES PUBLIC.USER(ID) (1)"; SQL statement:
INSERT INTO PUBLIC.ARTICLE(ID, VERSION, ARTICLE, AUTHOR_ID, ICON_NAME, NAME, TITLE, EDITOR_ID) VALUES (4, 0, 'clobclobyolo', 1, 'book', 'Introduction to 1, Consumer Place', 'one', null), (5, 0, 'clobclobyolo', 1, 'mail', 'Email Solution (Digital Marketing Center)', 'one', null), (6, 0, 'clobclobyolo', 1, 'glob', 'Global Registration System (GRS)', 'one', null), (7, 0, 'clobclobyolo', 1, 'ticket', 'Ticketing Tool to drive CRM work (Service Now)', 'one', null), (8, 0, 'clobclobyolo', 1, 'pie-chart', '1.Consumer Place Reporting', 'one', null), (9, 0, 'clobclobyolo', 1, 'sms', 'SMS Solution', 'one', null), (10, 0, 'clobclobyolo', 1, 'list', 'Driving trial through Brand Propensity Model', 'one', null), (11, 0, 'clobclobyolo', 1, 'line-chart', 'Data Integration Capabilities', 'one', null), (12, 0, 'clobclobyolo', 1, 'application', 'What is DMP, CRM and DMP better together', 'one', null), (13, 0, 'clobclobyolo', 1, 'bar-chart', 'Data Source performance Tracking', 'one', null), (14, 0, 'clobclobyolo', 1, 'facebook', 'Facebook Leads Campaigns', 'one', null), (15, 0, 'clobclobyolo', 1, 'cloud-glob', 'Learn more about Data Enrichments', 'one', null) [23506-197]

这段代码有什么问题?到目前为止,我已经花了大约5个小时,我放弃了,用互联网上找到的每一种可能的解决方案重写了千次关系。

如果它是相关的,你可以发现Long editorId - 它是因为我正在重写代码以包含带有映射的对象而不是长字段。

编辑:我不是应用程序的原作者,所以直到现在我还不知道另一个.sql文件 - 这个创建了上面的表,也许答案就在这里。我不确定,因为例如在ARTICLE表中现在有“EDITOR_ID”列,我认为整个文件都可以删除。据我所知,Hibernate在运行时创建了数据库,并且在我将Long authorId更改为UserItem author之前它正在运行。

CREATE TABLE ARTICLE(
    ID BIGINT PRIMARY KEY NOT NULL,
    VERSION BIGINT NOT NULL,
    ARTICLE CLOB NOT NULL,
    AUTHOR_ID BIGINT NOT NULL,
    ICON_NAME VARCHAR(255) NOT NULL,
    NAME VARCHAR(255) NOT NULL,
    TITLE VARCHAR(255) NOT NULL,
    EDITOR_ID BIGINT
);

CREATE TABLE USER(
    ID BIGINT PRIMARY KEY NOT NULL,
    VERSION BIGINT NOT NULL,
    CREDENTIALS_NON_EXPIRED BOOLEAN NOT NULL,
    ACCOUNT_NON_EXPIRED BOOLEAN NOT NULL,
    ACCOUNT_NON_LOCKED BOOLEAN NOT NULL,
    COMPANY VARCHAR(255) NOT NULL,
    ENABLED BOOLEAN NOT NULL,
    FAIL_LOGINS INTEGER NOT NULL,
    LAST_NAME VARCHAR(255) NOT NULL,
    NAME VARCHAR(255) NOT NULL,
    PASSWORD VARCHAR(255) NOT NULL,
    PASSWORD_NON_EXPIRED BOOLEAN NOT NULL,
    PHONE VARCHAR(255),
    REASONS_FOR_ACCESS VARCHAR(255) NOT NULL,
    USERNAME VARCHAR(255) NOT NULL
);

此外,我正在使用的数据库是H2,如果它有任何区别。

0 个答案:

没有答案