【发布时间】:2011-05-13 21:05:27
【问题描述】:
删除@Embeddable 对象时,我遇到了一些问题。
我有以下域类:SwitchVoipTrunkGroup 和 PrioritizedCodec。后者包含几个可以为空的字段。
class SwitchVoipTrunkGroup {
//...
@CollectionOfElements(fetch = FetchType.LAZY)
@JoinTable(
name = "SWITCH_VOIP_TKG_CODEC",
joinColumns = @JoinColumn(name = "FK_SWITCH_VOIP_TKG_ID")
)
@ForeignKey(name = "FK_CODEC_SWITCH_VOIP_TKG")
private Set<PrioritizedCodec> prioritizedCodecs = new HashSet<PrioritizedCodec>();
//...
}
@Embeddable
public class PrioritizedCodec {
@Column(name = "PRIORITY")
private String priority;
@Column(name = "FAX_MODE")
private String faxMode;
//... some more columns ...
}
当我编辑 SwitchVoipTrunkGroup 的 prioritydCodecs 字段(例如,通过删除条目)并保存实体时,我在 Hibernate 日志记录中看到以下内容:
13:54:31,919 INFO [STDOUT] Hibernate: delete from T_SWITCH_VOIP_TKG_CODEC where
fk_switch_voip_tkg_id=? and fax_mode=? and priority=?
来自this question 我明白为什么Hibernate 使用where 子句中的所有字段。但是,这会带来问题:如果其中一些字段为空,则查询将如下所示:
delete from T_SWITCH_VOIP_TKG_CODEC where fk_switch_voip_tkg_id=1 and fax_mode = ''
and priority =''
然而,这不会删除任何记录,因为 Hibernate 真正需要的是检查空字符串的 NULL iso。例如:
delete from T_SWITCH_VOIP_TKG_CODEC where fk_switch_voip_tkg_id=1 and fax_mode
IS NULL and priority IS NULL
(请参阅here,了解为什么检查空字符串还不够)
关于如何解决这个问题的任何想法?非常感谢!
【问题讨论】:
-
在执行删除操作之前,您是否有理由无法在您的实体中将这些属性的值设置为 null?
-
它们为 null 的事实正是问题所在,因为这使得 Hibernate 在 where 子句中检查空字符串。
-
事情是,@Embeddable 对象的概念是它们的生命周期与其父对象的生命周期相关联——删除它们而不删除它们的父对象似乎是错误的。