Coldfusion ORM: удалить в каскаде - PullRequest
1 голос
/ 30 мая 2011

Я не специалист по холодному синтезу и призываю вас помочь, потому что я дергаю себя за волосы!

Я исключаю удаление сущности «Действие», которая имеет 2 отношения «один ко многим», «Тексты» и «Бонус».

Когда я пытаюсь удалить действие, в котором есть только тексты, но нет бонуса, все в порядке. Hibernate удаляет запись Action и дочерние тексты. Это то, что я хочу!

Но когда у Акции есть и тексты, и бонус, я получаю эту ошибку:

Column 'bonus_actionId' cannot be null
Root cause :java.sql.BatchUpdateException: Column 'bonus_actionId' cannot be null

Почему Hibernate не удаляет бонус перед удалением действия? Как это сделано для текстов?

Спасибо

Действие сущности:

component {
    property name="id"      column="action_id" type="numeric" fieldtype="id" generator="native";

    /* ... */

    property name="texts" type="array" 
             fieldtype="one-to-many" cfc="Text" fkcolumn="text_actionId" singularname="text"
             cascade="all-delete-orphan" lazy="true";

    /* ... */

    property name="bonus" type="array" 
             fieldtype="one-to-many" cfc="Bonus" fkcolumn="bonus_actionId" singularname="bonus" 
             cascade="all-delete-orphan" lazy="true";
}

Текстовая сущность:

component {
    property name="id"      column="text_id" type="numeric" fieldtype="id" generator="native";

    /* ... (properties without relationships */

    property name="action" fieldtype="many-to-one" fkcolumn="text_actionId" cfc="Action" notnull="false" lazy="true";
}

Бонусная сущность:

component  {
    property name="id"      column="bonus_id" type="numeric" fieldtype="id" generator="native";

    /* ... (properties WITH relationships */

    // Parent
    property name="action" fieldtype="many-to-one" fkcolumn="bonus_actionId" cfc="Action" notnull="true" lazy="true";

}

Ответы [ 2 ]

1 голос
/ 30 мая 2011

Каким-то образом Hiberate сначала установит для объекта значение Null (станет сиротой), а затем удалит сирот.

Итак .. удалите notnull="true" из свойства action в Bonus.cfc, и все готово.

0 голосов
/ 04 июля 2017

Вы можете сохранить свои notnull="true" и иметь правильную работу каскадов, добавив inverse="true" к стороне владения внешним ключом отношений.

В вашем случае это будет для сущности Action:

component {

    property name="id"
             column="action_id"
             type="numeric"
             fieldtype="id"
             generator="native";

    /* ... */

    property name="texts"
             type="array" 
             fieldtype="one-to-many"
             cfc="Text"
             fkcolumn="text_actionId"
             singularname="text"
             cascade="all-delete-orphan"
             inverse="true"
             lazy="true";

    /* ... */

    property name="bonus"
             type="array" 
             fieldtype="one-to-many"
             cfc="Bonus"
             fkcolumn="bonus_actionId"
             singularname="bonus" 
             cascade="all-delete-orphan"
             inverse="true"
             lazy="true";
}

Вот описание того, как inverse работает в Hibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...