Всем привет. Делаю проект по туториалу и при попытке регистрации пользователя вылетает ошибка: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [NICK.FK_APP_USER]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
Вот полная ошибка:
HTTP Status 500 - Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [NICK.FK_APP_USER]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
type Exception report
message Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [NICK.FK_APP_USER]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
description The server encountered an internal error that prevented it from fulfilling this request.
В sysout выводит следующее:
21:40:30.153 [http-nio-8081-exec-5] WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 2291, SQLState: 23000
21:40:30.154 [http-nio-8081-exec-5] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - ORA-02291: integrity constraint (NICK.FK_APP_USER) violated - parent key not found
Гуглил ошибку ORA-02291 - в ней говорится что, нельзя вставить запись в дочернюю таблицу, так как она ссылается на запись в родительской таблице, которой якобы нет. Хотя в sysout до этого вывело следующее:
Hibernate:
insert
into
APP_USER
(EMAIL, FIRST_NAME, LAST_NAME, PASSWORD, SSO_ID, ID)
values
(?, ?, ?, ?, ?, ?)
Hibernate:
insert
into
APP_USER_USER_PROFILE
(USER_ID, USER_PROFILE_ID)
values
(?, ?)
То есть хибер вставил запись в таблицу APP_USER, которая является родительской, до того как вставлять запись в таблицу APP_USER_USER_PROFILE. И в итоге мне не понятно, в чем может быть ошибка.
Mike вот скрипт бд:
create sequence APP_USER_SEQ
;
/
create table APP_USER (
id number not null,
sso_id VARCHAR(30) NOT NULL,
password VARCHAR(100) NOT NULL,
first_name VARCHAR(30) NOT NULL,
last_name VARCHAR(30) NOT NULL,
email VARCHAR(30) NOT NULL,
constraint APP_USER_PK primary key (id),
constraint unique_sso_id unique (sso_id)
)
;
/
create or replace trigger APP_USER_ID_TRG
before insert on APP_USER
for each row
begin
select APP_USER_SEQ.nextval into :new.id from dual;
end
;
/
/* USER_PROFILE table contains all possible roles */
create sequence USER_PROFILE_SEQ
;
/
create table USER_PROFILE(
id number not null,
type VARCHAR(30) NOT NULL,
constraint USER_PROFILE_PK primary key (id),
constraint unique_prof_type unique (type)
)
;
/
create or replace trigger USER_PROFILE_ID_TRG
before insert on USER_PROFILE
for each row
begin
select USER_PROFILE_SEQ.nextval into :new.id from dual;
end
;
/
/* JOIN TABLE for MANY-TO-MANY relationship*/
CREATE TABLE APP_USER_USER_PROFILE (
user_id number,
user_profile_id number,
constraint APP_USER_USER_PROFILE_PK primary key (user_id, user_profile_id),
CONSTRAINT FK_APP_USER FOREIGN KEY (user_id) REFERENCES APP_USER (id),
CONSTRAINT FK_USER_PROFILE FOREIGN KEY (user_profile_id) REFERENCES USER_PROFILE (id)
)
;
/
/* Populate USER_PROFILE Table */
INSERT INTO USER_PROFILE(type)
VALUES ('USER');
/
INSERT INTO USER_PROFILE(type)
VALUES ('ADMIN');
/
INSERT INTO USER_PROFILE(type)
VALUES ('DBA');
/
/* Populate one Admin User which will further create other users for the application using GUI */
INSERT INTO APP_USER(sso_id, password, first_name, last_name, email)
VALUES ('sam','$2a$10$fEtN2hRHGQNzmW4p9Wvs5.AMgz0lxTJ3i2N34/.1fzuvIaLe671Te', 'Sam','Smith','samy@xyz.com');
/* Populate JOIN Table */
INSERT INTO APP_USER_USER_PROFILE (user_id, user_profile_id)
VALUES (
(select APP_USER.id
from APP_USER
where APP_USER.sso_id='sam' ),
(select user_profile.id
from user_profile
where user_profile.type='ADMIN' )
);
/
/* Create persistent_logins Table used to store rememberme related stuff*/
CREATE TABLE persistent_logins (
username VARCHAR(64) NOT NULL,
series VARCHAR(64) NOT NULL,
token VARCHAR(64) NOT NULL,
last_used TIMESTAMP NOT NULL,
constraint persistent_logins_PK primary key (series)
);
/
Mike вы оказались правы.
insert
into
APP_USER
(EMAIL, FIRST_NAME, LAST_NAME, PASSWORD, SSO_ID, ID)
values
(?, ?, ?, ?, ?, ?)
Hibernate:
insert
into
APP_USER
(EMAIL, FIRST_NAME, LAST_NAME, PASSWORD, SSO_ID, ID)
values
(?, ?, ?, ?, ?, ?)
22:35:01,273 TRACE BasicBinder:81 - binding parameter [1] as [VARCHAR] - [will@gmail.com]
22:35:01,274 TRACE BasicBinder:81 - binding parameter [2] as [VARCHAR] - [will]
22:35:01,274 TRACE BasicBinder:81 - binding parameter [3] as [VARCHAR] - [smith]
22:35:01,275 TRACE BasicBinder:81 - binding parameter [4] as [VARCHAR] - [$2a$10$6fCU6y6IrBJyuSTYn4LmR.3AFBEQ71RRaOWkcH6brXU8bu9t.SqJC]
22:35:01,275 TRACE BasicBinder:81 - binding parameter [5] as [VARCHAR] - [will]
22:35:01,276 TRACE BasicBinder:81 - binding parameter [6] as [INTEGER] - [400]
22:35:01,297 DEBUG SQL:109 -
insert
into
APP_USER_USER_PROFILE
(USER_ID, USER_PROFILE_ID)
values
(?, ?)
Hibernate:
insert
into
APP_USER_USER_PROFILE
(USER_ID, USER_PROFILE_ID)
values
(?, ?)
22:35:01,298 TRACE BasicBinder:81 - binding parameter [1] as [INTEGER] - [400]
22:35:01,299 TRACE BasicBinder:81 - binding parameter [2] as [INTEGER] - [1]
22:35:01,347 WARN SqlExceptionHelper:144 - SQL Error: 2291, SQLState: 23000
22:35:01,348 ERROR SqlExceptionHelper:146 - ORA-02291: integrity constraint (NICK.FK_APP_USER) violated - parent key not found
22:35:01,353 INFO AbstractBatchImpl:208 - HHH000010: On release of batch it still contained JDBC statements
Откуда значение 400 выскакивает сказать не могу( Mike можете подсказать куда дальше копать? Или не правы. На таблице стоит триггер и он должен вернуть 2, почему 400 летит не понятно. Но даже если оно (400) выскочило оно все сохраняется в APP_USER а потом в дочернюю таблицу заносится.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости