2011-10-10 83 views
0

我在休眠JPA註釋一對多關係工作,這裏是我的表和實體類的細節...Hibernate註解一個一對多的親子刪除

Service (entity class: ServiceRegistration.java) 
======= 
serviceid 
servicename 

channel meta table (entity class: Channels.java) 
======== 
channelid 
channelname 

service_channel (entity class: ServiceChannels.java) 
=============== 
seq_id 
serviceid 
channelid 

這裏,service_channel表有服務ID和channelid作爲forign鍵..我可以獲取,修改記錄。

  1. ,但我無法能夠刪除服務和它的子記錄。如果我刪除服務表中的記錄,對應的service_channel表中的記錄應該被刪除。這裏是我的實體類的細節...

  2. 另外,我得到重複的記錄..說如果一個服務(service1)有2個通道關聯,當我獲取服務列表時,我看到列表中的2個service1條目。

serviceregistration.java

@OneToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "multichannel_service_channel", joinColumns = { 
    @JoinColumn(name="serviceid", unique = true) 
    }, 
    inverseJoinColumns = { 
    @JoinColumn(name="channelid") 
    } 
    ) 
    private Set<Channels> channelsInvolved; 


    @OneToMany(mappedBy="serviceRegistration") 
    @Cascade(org.hibernate.annotations.CascadeType.REMOVE) 
    private List<ServiceChannel> serviceChannels; 

servicechannel.java

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column private int servicechannelid;  

@ManyToOne 
    @JoinColumn(name = "serviceid") 
    private ServiceRegistration serviceRegistration; 

@ManyToOne 
    @JoinColumn(name = "channelid") 
    private Channels channels; 

channels.java

@Id 
@Column 
private int channelid; 

@Column 
private String channelname; 

@Column 
private String channeldescription; 

@Column 
private boolean isactive; 

請幫助解決這個問題。

回答

0

你現在在問2個問題。


僅僅因爲被引用而無法刪除服務。 您應該先刪除被引用的實體(或更新它們以使服務不被引用)。

這意味着,您應該先刪除相應的ServiceChannels,然後再刪除Service。

通過Service的「自動」刪除ServiceChannel可以通過級聯類型「Delete Orphan」來實現,這是Hibernate特有的功能。


對於重複的名單,我相信這取決於你用於檢索列表中的HQL。如果您已加入/加入獲取的serviceChannels,它將導致重複的記錄。您應該使用「select distinct」或添加一個不同的結果轉換器來處理該轉換。

+0

Thanks al ot爲你的答案,這是我試過..... ** @ OneToMany(mappedBy =「serviceRegistration」) @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) private List serviceChannels; **我得到的錯誤.....批量更新返回意外的行數從ü pdate [0];實際行數:0;預計:1;嵌套異常是org.hibernate.S taleStateException:批處理更新從update [0]返回意外的行計數; 實際行數:0;預計:1 – Surez

+0

我不知道你跑了什麼,我認爲沒有人可以幫助你。但是,根據我的經驗,StaleStateException似乎是另一個與此問題無關的問題。你可以做一個簡單的測試,試試DELETE_ORPHAN,並確保你知道你正確使用它?我擔心你的代碼中不僅有一個問題會使你的問題複雜化。 –

0

你想要定義一個@ManyToMany,或者你是否試圖用兩個@ManyToOnes來模擬@ManyToMany?似乎你正在做這兩件事,這是行不通的。

您有兩種選擇。首先,@ManyToMany:

create table service_channel (
    service_id int not null, 
    channel_id int not null, 
    primary key (service_id, channel_id)); 

ServiceRegistration.java

@ManyToMany 
@JoinTable(name = "service_channel", 
      joinColumns = @JoinColumn(name="service_id"), 
      inverseJoinColumns = @JoinColumn(name="channel_id")) 
private Set<Channel> channels; 

Channel.java

@ManyToMany(mappedBy = "channels") 
private Set<Service> services; 

其中ServiceChannel.java不存在。其次,可以促進ServiceChannel到實體地位,整個事情有兩個@OneToManys型號:

create table service_channel (
    id int not null primary key, 
    service_id int not null, 
    channel_id int not null); 

ServiceChannel.java:

@ManyToOne 
@JoinColumn(name = "service_id") 
private Service service; 

@ManyToOne 
@JoinColumn(name = "channel_id") 
private Channel channel; 

Service.java:

@OneToMany(mappedBy = "service") 
private ServiceChannel serviceChannel; 

通道.java:

@OneToMany(mappedBy = "channel") 
private ServiceChannel serviceChannel; 
+0

好的非常感謝。我會根據你的建議嘗試...... – Surez