Я сталкиваюсь с ошибкой 1452 на MySQL 5.5.9 при выполнении некоторого учебного кода JPA, который я вытащил с веб-сайта EclipseLink (http://wiki.eclipse.org/EclipseLink/Examples/JPA/EmployeeXML),, и я надеюсь, что у кого-то есть понимание.
Я использую последнюю стабильную сборку для EclipseLink на сегодняшний день с основного сайта:
eclipselink-jpa-modelgen_2.1.2.v20101206-r8635.jar и javax.persistence_2.0.1.v201006031150.jar.
Когда я заполняю базу данных через CreateDatabase.java, я получаю следующую ошибку:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (jpatutorial
. phone
, CONSTRAINT FK_PHONE_EMP_PH_ID
FOREIGN KEY (EMP_PH_ID
) ССЫЛКИ EMPLOYEE
(EMP_ID
))
Код ошибки: 1452
Вызов: ВСТАВЬТЕ В ТЕЛЕФОН (PH_ID, TYPE, AREA_CODE, P_NUMBER, EMP_PH_ID) VALUES (?,?,?,?,?)
bind => [25, Work, 613, 5558812, 23]
Запрос: InsertObjectQuery (Телефон ([Работа] 613 - 5558812))
Соответствующими моделями здесь являются таблица Employee и таблица Phone. Между Телефоном и Сотрудниками существует многозначная связь. Часть файла orm.xml находится ниже:
<entity class="model.PhoneNumber">
<table name="PHONE" />
<attributes>
.
.
<many-to-one name="owner">
<join-column name="EMP_PH_ID" />
</many-to-one>
</attributes>
</entity>
<entity class="model.Employee">
<!-- secondary-table name="SALARY" /-->
<attributes>
<id name="id">
<column name="EMP_ID" />
<generated-value />
</id>
.
.
<one-to-many name="phoneNumbers" mapped-by="owner">
<cascade>
<cascade-all />
</cascade>
<private-owned />
</one-to-many>
.
.
</attributes>
</entity>
Код успешно создает таблицы, создает записи адресов для сотрудников, создает все записи сотрудников, но затем не удается вставить запись телефона, даже если он имеет действительную ссылку FK на запись сотрудника. Я упростил код, чтобы он выполнялся, сохранялся и фиксировал все до момента сбоя, но независимо от того, выполняю ли я вставку через JPA или вручную, запуская скрипт SQL, я получаю ту же ошибку 1452.
Интересно, что я обнаружил, что если я отбросил все связанные сущности Employee и воссоздал их на основе создания определений таблиц, созданных в MySQL, я могу успешно вставлять записи во все таблицы с помощью JPA и вручную с помощью сценариев. Таким образом, это говорит о том, что Eclipselink создает таблицы каким-то образом, что создает проблему, а MySQL Workbench не использует эти проблемные определения в ходе обратного инжиниринга. На данный момент у меня нет идей.
Добавить DDL из журнала FINEST:
[EL Finest]: sequencing connected, state is Preallocation_Transaction_NoAccessor_State
[EL Finest]: sequence : preallocation size 50
[EL Finest]: sequence SEQ_GEN: preallocation size 50
[EL Info]: file:/Users/dylantong/Documents/workspace/JPA Tutorial/bin/_employee login successful
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE PHONE DROP FOREIGN KEY FK_PHONE_EMP_PH_ID")
[EL Fine]: Connection(876256661)--ALTER TABLE PHONE DROP FOREIGN KEY FK_PHONE_EMP_PH_ID
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE EMPLOYEE DROP FOREIGN KEY FK_EMPLOYEE_MANAGER_ID")
[EL Fine]: Connection(876256661)--ALTER TABLE EMPLOYEE DROP FOREIGN KEY FK_EMPLOYEE_MANAGER_ID
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE EMPLOYEE DROP FOREIGN KEY FK_EMPLOYEE_ADDR_ID")
[EL Fine]: Connection(876256661)--ALTER TABLE EMPLOYEE DROP FOREIGN KEY FK_EMPLOYEE_ADDR_ID
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE PROJ_EMP DROP FOREIGN KEY FK_PROJ_EMP_EMP_ID")
[EL Fine]: Connection(876256661)--ALTER TABLE PROJ_EMP DROP FOREIGN KEY FK_PROJ_EMP_EMP_ID
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE PROJ_EMP DROP FOREIGN KEY FK_PROJ_EMP_PROJ_ID")
[EL Fine]: Connection(876256661)--ALTER TABLE PROJ_EMP DROP FOREIGN KEY FK_PROJ_EMP_PROJ_ID
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE PROJECT DROP FOREIGN KEY FK_PROJECT_LEADER_ID")
[EL Fine]: Connection(876256661)--ALTER TABLE PROJECT DROP FOREIGN KEY FK_PROJECT_LEADER_ID
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE LPROJECT DROP FOREIGN KEY FK_LPROJECT_PROJ_ID")
[EL Fine]: Connection(876256661)--ALTER TABLE LPROJECT DROP FOREIGN KEY FK_LPROJECT_PROJ_ID
[EL Finest]: Execute query DataModifyQuery(sql="DROP TABLE PHONE")
[EL Fine]: Connection(876256661)--DROP TABLE PHONE
[EL Finest]: Execute query DataModifyQuery(sql="CREATE TABLE PHONE (PH_ID INTEGER NOT NULL, TYPE VARCHAR(255) NOT NULL, AREA_CODE VARCHAR(255), P_NUMBER VARCHAR(255), EMP_PH_ID INTEGER, PRIMARY KEY (PH_ID, TYPE))")
[EL Fine]: Connection(876256661)--CREATE TABLE PHONE (PH_ID INTEGER NOT NULL, TYPE VARCHAR(255) NOT NULL, AREA_CODE VARCHAR(255), P_NUMBER VARCHAR(255), EMP_PH_ID INTEGER, PRIMARY KEY (PH_ID, TYPE))
[EL Finest]: Execute query DataModifyQuery(sql="DROP TABLE EMPLOYEE")
[EL Fine]: Connection(876256661)--DROP TABLE EMPLOYEE
[EL Finest]: Execute query DataModifyQuery(sql="CREATE TABLE EMPLOYEE (EMP_ID INTEGER NOT NULL, L_NAME VARCHAR(255), END_TIME TIME, VERSION BIGINT, START_TIME TIME, GENDER VARCHAR(255), salary DOUBLE, F_NAME VARCHAR(255), MANAGER_ID INTEGER, ADDR_ID INTEGER, START_DATE DATE, END_DATE DATE, PRIMARY KEY (EMP_ID))")
[EL Fine]: Connection(876256661)--CREATE TABLE EMPLOYEE (EMP_ID INTEGER NOT NULL, L_NAME VARCHAR(255), END_TIME TIME, VERSION BIGINT, START_TIME TIME, GENDER VARCHAR(255), salary DOUBLE, F_NAME VARCHAR(255), MANAGER_ID INTEGER, ADDR_ID INTEGER, START_DATE DATE, END_DATE DATE, PRIMARY KEY (EMP_ID))
[EL Finest]: Execute query DataModifyQuery(sql="DROP TABLE PROJ_EMP")
[EL Fine]: Connection(876256661)--DROP TABLE PROJ_EMP
[EL Finest]: Execute query DataModifyQuery(sql="CREATE TABLE PROJ_EMP (EMP_ID INTEGER NOT NULL, PROJ_ID INTEGER NOT NULL, PRIMARY KEY (EMP_ID, PROJ_ID))")
[EL Fine]: Connection(876256661)--CREATE TABLE PROJ_EMP (EMP_ID INTEGER NOT NULL, PROJ_ID INTEGER NOT NULL, PRIMARY KEY (EMP_ID, PROJ_ID))
[EL Finest]: Execute query DataModifyQuery(sql="DROP TABLE ADDRESS")
[EL Fine]: Connection(876256661)--DROP TABLE ADDRESS
[EL Finest]: Execute query DataModifyQuery(sql="CREATE TABLE ADDRESS (ADDRESS_ID INTEGER NOT NULL, P_CODE VARCHAR(255), STREET VARCHAR(255), PROVINCE VARCHAR(255), COUNTRY VARCHAR(255), CITY VARCHAR(255), PRIMARY KEY (ADDRESS_ID))")
[EL Fine]: Connection(876256661)--CREATE TABLE ADDRESS (ADDRESS_ID INTEGER NOT NULL, P_CODE VARCHAR(255), STREET VARCHAR(255), PROVINCE VARCHAR(255), COUNTRY VARCHAR(255), CITY VARCHAR(255), PRIMARY KEY (ADDRESS_ID))
[EL Finest]: Execute query DataModifyQuery(sql="DROP TABLE PROJECT")
[EL Fine]: Connection(876256661)--DROP TABLE PROJECT
[EL Finest]: Execute query DataModifyQuery(sql="CREATE TABLE PROJECT (PROJ_ID INTEGER NOT NULL, PROJ_TYPE VARCHAR(31), DESCRIP VARCHAR(255), PROJ_NAME VARCHAR(255), VERSION BIGINT, LEADER_ID INTEGER, PRIMARY KEY (PROJ_ID))")
[EL Fine]: Connection(876256661)--CREATE TABLE PROJECT (PROJ_ID INTEGER NOT NULL, PROJ_TYPE VARCHAR(31), DESCRIP VARCHAR(255), PROJ_NAME VARCHAR(255), VERSION BIGINT, LEADER_ID INTEGER, PRIMARY KEY (PROJ_ID))
[EL Finest]: Execute query DataModifyQuery(sql="DROP TABLE RESPONS")
[EL Fine]: Connection(876256661)--DROP TABLE RESPONS
[EL Finest]: Execute query DataModifyQuery(sql="CREATE TABLE RESPONS (EMP_ID INTEGER NOT NULL, RESPON_DESC VARCHAR(255))")
[EL Fine]: Connection(876256661)--CREATE TABLE RESPONS (EMP_ID INTEGER NOT NULL, RESPON_DESC VARCHAR(255))
[EL Finest]: Execute query DataModifyQuery(sql="DROP TABLE LPROJECT")
[EL Fine]: Connection(876256661)--DROP TABLE LPROJECT
[EL Finest]: Execute query DataModifyQuery(sql="CREATE TABLE LPROJECT (PROJ_ID INTEGER NOT NULL, MILESTONE DATETIME, BUDGET DOUBLE, PRIMARY KEY (PROJ_ID))")
[EL Fine]: Connection(876256661)--CREATE TABLE LPROJECT (PROJ_ID INTEGER NOT NULL, MILESTONE DATETIME, BUDGET DOUBLE, PRIMARY KEY (PROJ_ID))
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE PHONE ADD CONSTRAINT FK_PHONE_EMP_PH_ID FOREIGN KEY (EMP_PH_ID) REFERENCES EMPLOYEE (EMP_ID)")
[EL Fine]: Connection(876256661)--ALTER TABLE PHONE ADD CONSTRAINT FK_PHONE_EMP_PH_ID FOREIGN KEY (EMP_PH_ID) REFERENCES EMPLOYEE (EMP_ID)
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE EMPLOYEE ADD CONSTRAINT FK_EMPLOYEE_MANAGER_ID FOREIGN KEY (MANAGER_ID) REFERENCES EMPLOYEE (EMP_ID)")
[EL Fine]: Connection(876256661)--ALTER TABLE EMPLOYEE ADD CONSTRAINT FK_EMPLOYEE_MANAGER_ID FOREIGN KEY (MANAGER_ID) REFERENCES EMPLOYEE (EMP_ID)
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE EMPLOYEE ADD CONSTRAINT FK_EMPLOYEE_ADDR_ID FOREIGN KEY (ADDR_ID) REFERENCES ADDRESS (ADDRESS_ID)")
[EL Fine]: Connection(876256661)--ALTER TABLE EMPLOYEE ADD CONSTRAINT FK_EMPLOYEE_ADDR_ID FOREIGN KEY (ADDR_ID) REFERENCES ADDRESS (ADDRESS_ID)
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE PROJ_EMP ADD CONSTRAINT FK_PROJ_EMP_EMP_ID FOREIGN KEY (EMP_ID) REFERENCES EMPLOYEE (EMP_ID)")
[EL Fine]: Connection(876256661)--ALTER TABLE PROJ_EMP ADD CONSTRAINT FK_PROJ_EMP_EMP_ID FOREIGN KEY (EMP_ID) REFERENCES EMPLOYEE (EMP_ID)
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE PROJ_EMP ADD CONSTRAINT FK_PROJ_EMP_PROJ_ID FOREIGN KEY (PROJ_ID) REFERENCES PROJECT (PROJ_ID)")
[EL Fine]: Connection(876256661)--ALTER TABLE PROJ_EMP ADD CONSTRAINT FK_PROJ_EMP_PROJ_ID FOREIGN KEY (PROJ_ID) REFERENCES PROJECT (PROJ_ID)
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE PROJECT ADD CONSTRAINT FK_PROJECT_LEADER_ID FOREIGN KEY (LEADER_ID) REFERENCES EMPLOYEE (EMP_ID)")
[EL Fine]: Connection(876256661)--ALTER TABLE PROJECT ADD CONSTRAINT FK_PROJECT_LEADER_ID FOREIGN KEY (LEADER_ID) REFERENCES EMPLOYEE (EMP_ID)
[EL Finest]: Execute query DataModifyQuery(sql="ALTER TABLE LPROJECT ADD CONSTRAINT FK_LPROJECT_PROJ_ID FOREIGN KEY (PROJ_ID) REFERENCES PROJECT (PROJ_ID)")
[EL Fine]: Connection(876256661)--ALTER TABLE LPROJECT ADD CONSTRAINT FK_LPROJECT_PROJ_ID FOREIGN KEY (PROJ_ID) REFERENCES PROJECT (PROJ_ID)
[EL Finest]: Execute query DataModifyQuery(sql="CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(38), PRIMARY KEY (SEQ_NAME))")
[EL Fine]: Connection(876256661)--CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(38), PRIMARY KEY (SEQ_NAME))
[EL Fine]: SELECT 1