Исключение HibernateException: внешний ключ не может быть нулевым

#java #hibernate

#java #переход в спящий режим

Вопрос:

У меня есть следующее довольно простое отношение «многие к одному» между Person и их родителями / дочерними элементами (которые также снова являются экземплярами Person).

Person.hbm.xml

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 04.05.2011 15:02:31 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="test.Person" table="PERSONS">

        <id name="id" type="long" access="field">
            <column name="PERSON_ID" />
            <generator class="native" />
        </id>

        <bag name="children" table="PERSONS" lazy="false" inverse="true" cascade="all">
            <key column="PERSON_ID" not-null="false"></key>
            <one-to-many class="test.Person" />
        </bag>

        <many-to-one name="parent" column="PARENT_ID" not-null="false" />

    </class>
</hibernate-mapping>
  

Теперь проблема в моем случае заключается в том, что у меня есть экземпляры Person, у которых нет родителей (например, сироты).

Если я пытаюсь сохранить эти объекты, я получаю:

java.sql.SQLException: null, сообщение от сервера: «Столбец ‘PARENT_ID’ не может быть нулевым»

Если я задаю not-null="true" в файле сопоставления, я получаю:

org.hibernate.PropertyValueException: свойство not-null ссылается на нулевое или переходное значение: test.parent

В чем здесь волшебный трюк?

Комментарии:

1. Первое сообщение об ошибке поступает с сервера, а не из режима гибернации. Вы уверены, что PARENT_ID имеет значение null в таблице базы данных?

2. что, если вы удалите ключ not-null="false" из bag ? У меня такая же среда, но с list вместо bag

3. @Ben Hoffstein Я использую MySQL. Я разрешаю Hibernate автоматически создавать таблицы для меня, задав <имя свойства=»hbm2ddl.auto»> создать</property>

4. @jotapdiez Это не помогло.

Ответ №1:

Valmar, поскольку вы получаете исключение SQL, вероятно, ваш СТОЛБЕЦ ‘PARENT_ID’ имеет ограничение not null. Проверьте свою таблицу DDL. Какую базу данных вы используете?

Комментарии:

1. Я использую MySQL. Я разрешаю Hibernate автоматически создавать таблицы для меня, устанавливая <property name="hbm2ddl.auto">create</property> .

2. Тем не менее, можете ли вы проверить определение таблицы в MySQL, чтобы увидеть, точно ли Hibernate генерирует столбец с нулевым значением?

3. Я удалил все таблицы и позволил Hibernate создать их заново. Теперь столбцы, похоже, обнуляются, но я получаю новое исключение: java.sql.SQLException: null, message from server: "Cannot add or update a child row: a foreign key constraint fails (´mydb/PERSONS´, CONSTRAINT ´FK5A63FB1DE1B4BCAD´ FOREIGN KEY (´PERSON_ID´) REFERENCES ´PERSONS´ (´PERSON_ID´))"

4. Жужжание… Существует ВНЕШНИЙ КЛЮЧ из PERSONS.PERSON_ID В PERSONS.PERSON_ID. Удалите этот внешний ключ (и, если соответствует вашим потребностям, создайте его из PERSONS. PARENT_ID ДЛЯ PERSONS.PERSON_ID).

5. Черт возьми, ты прав! Я был так слеп (время выпить кофе). Спасибо за вашу помощь!