2012-12-28 217 views
3

我有一個應該是許多一對多(雙向)休眠自動刪除許多一對多的關係

這是過濾器類的列表:

@ManyToMany(targetEntity=Serving.class) 
@JoinTable(name = "BRIDGE_SERV_FILTER", joinColumns={ 
    @JoinColumn(name="filter_id")}, inverseJoinColumns={@JoinColumn(name="serving_id")}) 
private List<Serving> servings; 
public List<Serving> getServing() { return this.servings; } 
public void setServing(List<Serving> servings) { this.servings = servings; } 

,這是服務類:

@ManyToMany(targetEntity=Filter.class) 
    @JoinTable(name = "BRIDGE_SERV_FILTER", joinColumns={ 
     @JoinColumn(name="serving_id")}, inverseJoinColumns={@JoinColumn(name="filter_id")}) 
    private List<Filter> filters; 
    public List<Filter> getFilters() { return filters;} 
    public void setFilters(List<Filter> filters) { this.filters = filters;} 

那我應該叫什麼從服務獲取所有的過濾器,這是我做(SERV是類型服務):

List<Filter> filters = serv.getFilters(); 

//iterate from all filter 
for(Filter allf : allFilter) 
{ 
    boolean mark_this = false; 
    //..and matched the currently-iterated-all-filters with filter from 
    //which the serving got 
    for(com.pos.model.Filter f : filters) 
    { 
     //if matched, mark this current filter 
     if (allf.getId().equals(f.getId())) 
      mark_this = true; 
    } 
    tmodel.addRow(new Object[] { allf.getName(), mark_this }); 
} 

該方法在模型中定義,它是靜態的。所以,當表單加載時,它會調用像jTable.setTableModel(Filter.toTableModel(thisServing));

它讀取並顯示數據。然而,Hibernate也調用刪除,以及:

Hibernate: select filter0_.filter_id as filter1_2_, filter0_.is_showable as is2_2_, filter0_.name as name2_ from DIM_FILTER filter0_ where is_showable=true 
Hibernate: select filters0_.serving_id as serving1_4_1_, filters0_.filter_id as filter2_6_1_, filter1_.filter_id as filter1_2_0_, filter1_.is_showable as is2_2_0_, filter1_.name as name2_0_ from BRIDGE_SERV_FILTER filters0_ inner join DIM_FILTER filter1_ on filters0_.filter_id=filter1_.filter_id where filters0_.serving_id=? 
Hibernate: delete from BRIDGE_SERV_FILTER where serving_id=? 

其實,我沒有做任何刪除所有,我不問冬眠刪除任何內容。我不明白的東西可能會發生......如何防止刪除Hibernate?或者我做錯了什麼?

+0

有趣的是,如果只調用getFilters(),則不會發生任何刪除。但是,如果我開始閱讀過濾器,然後執行addRow(),則會發生刪除。 – user1935622

+0

即使我使用set,仍然會自動刪除一次,我想要'get'。請幫助... – user1935622

回答

2

代碼中有一些地方必須清除服務的過濾器集合,或將此集合設置爲null。 Hibernate使這個改變持久。

另請注意,您的映射是錯誤的,這是您看到奇怪行爲的原因。而不是有一個雙向的ManyToMany,你有兩個不相關的,單向的ManyToMany,都使用相同的連接表。必須選擇其中一方作爲另一方的反面。例如,如果你想過濾器側是協會的主人,你必須使用mappedBy屬性標記發球方的反方:

class Filter { 
    @ManyToMany 
    @JoinTable(name = "BRIDGE_SERV_FILTER", joinColumns={ 
    @JoinColumn(name="filter_id")}, inverseJoinColumns={@JoinColumn(name="serving_id")}) 
    private List<Serving> servings; 
} 

class Serving { 
    @ManyToMany(mappedBy = "servings") 
    private List<Filter> filters; 
} 

這在the documentation描述。

+0

我已經相應地改變了,謝謝。它有點依然:存在奇怪的行爲。我已經做了一個簡單的測試目的,以獲取這個bi-di。獲取服務的getFilter後,它可以工作,並且不會被刪除。但是,當我使用表單時,它在初始化時也起作用,但它在調用Delete SQL之後短暫地爲Hibernate。 – user1935622

+1

它發生在您的代碼中的某處。但不在您發佈的代碼中。 –

+0

嗨。謝謝。我相信如此。現在我發現了這個問題。無論如何,謝謝。 – user1935622

0

這個問題自從8天以前對我已經有了,讓我無可奈何。

問題出在我如何得到列表()。所以...如果你有雙迪的關係,不要做的事情,如:

Long id = getIdFromCombo(); 
Serving s = (Serving) session.getId(Serving.class, id).uniqueResult(); 

當在同一時間,你初始化形式:

Public theFormName(Menu m){ 
    this.menu = m; 
} 

如果菜單得到了擔任它的一對多,你最好不要查詢服務對你的會議。最好一一匹配:

Serving s; 
for(int i=0; i<this.menu.getServings().size(); i++) 
{ 
    if(equal code) s = menu.getServings().get(i); 
} 

然後你不應該有像我上面列出的問題。這很奇怪。陷阱。我想知道是否有人遇到過這個問題。要麼這是我的錯,要麼是一個錯誤,我不確定。

因爲我仍然不明白爲什麼在服務類(通過Session的幫助)查詢時出現錯誤,同時有一個menu.getServings(),它可以提供您的服務(但與一個較少的觀點(因爲你服務與serve.menu.id =菜單。ID),無論如何,沒關係)