Проблемы ограничения внешнего ключа, включающие отношения один-ко-многим и многие-к-одному в EcliplseLink2.1.2 - PullRequest
1 голос
/ 26 февраля 2011

Я сталкиваюсь с ошибкой 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

1 Ответ

1 голос
/ 28 февраля 2011

Вы указали ошибку в проекте, а не в телефоне?

Пожалуйста, включите DDL и SQL, сгенерированные с лучшим входом в систему.

...