2010-11-22 56 views
3

當刪除@Embeddable對象時,我遇到了一些問題。如何刪除包含可空字段的Hibernate @Embeddables?

我有以下的域類: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的prioritizedCodecs字段(例如刪除條目)並保存實體,我看到在我的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異爲一個空字符串。例如:

delete from T_SWITCH_VOIP_TKG_CODEC where fk_switch_voip_tkg_id=1 and fax_mode 
IS NULL and priority IS NULL 

(參見here對於爲什麼檢查空字符串不足以更多信息)

如何解決這個任何想法?很多thx!

+0

是否有一個原因,爲什麼你不能設置這些屬性的值在執行刪除操作之前在您的實體中爲null? – 2010-11-22 15:05:49

+0

事實上,它們爲空就是問題所在,因爲這會讓Hibernate檢查where子句中的空字符串。 – 2010-11-23 06:57:24

+0

事情是,@Embeddable對象的概念是,他們的生命週期與他們的父母的生命週期相關聯 - 刪除他們而不刪除他們的父母似乎關閉。 – 2010-12-03 20:26:05

回答

1

我建議規範你的數據庫,所以你的類都成爲實體,然後在SwitchVoipTrunkGroup和PrioritizedCodec之間建立一對多關係,然後你可以設置級聯規則,這樣Hibernate會自動更新PrioritizedCodec類型元素的集合,當你堅持SwitchVoipTrungGroup的實例。

或者,您可以通過@Column批註的屬性指定優先級和faxMode字段默認值和強制可空約束

@Column(columnDefinition = "VARCHAR(20) default 'NONE'", nullable = false) 
private String faxMode;