Spring Boot Нарушение ограничения ссылочной целостности - PullRequest
0 голосов
/ 15 мая 2018

В начале я знаю, что здесь много сообщений об этом в stackoverflow, я пробовал каждое найденное мной решение.

Я создаю отношения OneToMany между моим "ARTICLE" и "USER".Таблицы - один пользователь для многих статей.Коды сущностей приведены ниже (я также использую Lombok, следовательно, аннотации @Getter и @Setter).

АРТИКУЛ:

@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;

}

ПОЛЬЗОВАТЕЛЬ:

@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, если онаимеет значение.

...