could not execute statement; SQL [n/a]; constraint [NICK.FK_APP_USER]

1282
29 марта 2017, 15:48

Всем привет. Делаю проект по туториалу и при попытке регистрации пользователя вылетает ошибка: 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 а потом в дочернюю таблицу заносится.

READ ALSO
Percolation via Monte Carlo simulation [требует правки]

Percolation via Monte Carlo simulation [требует правки]

Write a program to estimate the value of the percolation threshold via Monte Carlo simulation

340
Как работают lock объекты?

Как работают lock объекты?

Я пытаюсь разобраться с логикой лок-объектов на нескольких примерах, речь всегда пойдет об одном экземпляре MyClass:

377
Каким образом необходимо внедрить Hibernate Session Factory в Spring MVC?

Каким образом необходимо внедрить Hibernate Session Factory в Spring MVC?

Необходимо реализовать CRUD операции с БД MySQLИспользую Repository для доступа у данным

408