我不是冷血的专家,我打电话给你,因为我拉着头发!
我除了删除一对多关系的实体'Action','Texts'和'Bonus'。
当我尝试删除仅包含文本但没有奖励的动作时,一切都很好。 Hibernate删除Action记录和子文本。这就是我想要的!
但是当Action同时拥有文本和奖金时,我收到了这个错误:
Column 'bonus_actionId' cannot be null
Root cause :java.sql.BatchUpdateException: Column 'bonus_actionId' cannot be null
为什么Hibernate在删除Action之前不会删除Bonus?就像文字一样?
由于
行动实体:
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";
}
答案 0 :(得分:1)
Hibernate会先将实体设置为Null(成为孤儿),然后删除孤儿。
所以..从Bonus.cfc中的属性notnull="true"
中删除action
,您就已经完成了设置。
答案 1 :(得分:0)
通过将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";
}