2013-08-29 54 views
4

假設我有兩個類:一個用於Band,一個用於CD。我希望能夠輕鬆訪問一個樂隊的所有CD並找到CD的樂隊。如何在Java中表示1..n關係

我的解決方法是在CD場Band,並帶一個ArrayList<CD>

但我不覺得這是一個很好的解決方案。有沒有人知道這種情況下更好的設計?

+7

爲什麼你找不到好的解決辦法? – Joni

+2

java和外鍵之間的關係是什麼。據我所知,外鍵和主鍵都在sql中。爲什麼你的標籤是java和外鍵? – SpringLearner

+0

我把外鍵,因爲如果我把它映射到數據庫我會用外鍵鏈接CD和樂隊。 我不覺得這是一個很好的解決方案,因爲我存儲了兩次相同的信息,而我只是問我是否有更好的解決方案:) – trnsnt

回答

3

我明白爲什麼你不喜歡這個解決方案。

您只是儲存信息一次,但您必須更新兩個類別的變化。

如果更改的Band一個CD,你必須從舊Band刪除CD,設置BandCD,然後將其添加到新的Band

這當然很複雜並且容易出錯。

你的類沒有簡單的getter/setter方法。相反,您必須在您的域類中實現大量邏輯才能保持一致性。

當然,優點是您總是可以訪問CDBand,反之亦然。它是一個權衡。例如,你應該使用CDBand作爲其equals實現的一部分。

這裏有一個有趣替代,這可能是advantegous在某些情況下:

使用你的類BandCD只作爲簡單的POJO,並使用另一個類(即MusicService),以解決關係:

class MusicService { 
    Band getBand(CD cd); 
    List<CD> getCDs(Band band); 
    addCD(Band band, CD cd); 
} 
  • 優點:關注點分離,無狀態的服務
  • 缺點:更多的代碼
+0

感謝您的回答,您完全理解我的觀點!我想我會使用一個服務類,聽起來更安全的想法! – trnsnt

0

你可以有光盤的Set在帶班。

可替代地,保持一個唯一的ID在頻帶類別,將每個唯一的帶映射與多個CD。

有沒有需要有一個樂隊在現場CD,按我的理解。

+0

是否有(功能上)每張CD都有一個樂隊ID和每張CD上的樂隊的參考有什麼區別? –

+0

如果您的CD僅保留對ID的引用,則Band可能會收到垃圾回收,如果沒有其他引用。 – Holger

1

您的解決方案完全合理。其實這就是JPA的原理。 見Java Persistence/OneToMany。 JPA是如何實現自己的ORM的很好的參考。

0

你是不是存儲信息的兩倍:CD只需擁有一個指向類樂隊。 如果在C++中完成,那麼這需要一些思考(例如,在CD中使用weak_ptr來避免循環引用),但在Java中,當Band在其他地方未被引用時,GC將負責移除這兩個對象。

可以保證一定的一致性(如CD只在一個波段)通過編寫一些代碼,完成這個功能,如下面的代碼(警告:未測試):

class Band 
{ 
private List<CD> m_cds; 

public void addCD(CD cd) 
{ 
    id(cd.getBand() == this) 
    { 
    return; 
    } 
    if(cd.getBand() != null) 
    { 
    cd.getBand().removeCd(CD cd); 
    } 
    cd.setBand(this); 
    m_cds.add(cd); 
} 

public void removeCd(CD cd) 
{ 
    cd.setBand(null); 
    m_cds.remove(cd); 
} 
} 


class CD 
{ 
private Band m_band; 

public void setBand(Band band) 
{ 
    m_band = band; 
} 

public Band getBand() 
{ 
    return m_band; 
} 
} 
+0

感謝您的回答。 我知道我沒有在內存中存儲兩次這樣的信息,但是就像功能信息的重複一樣。如果我在CD中存儲對樂隊的引用,它在功能上等同於擁有一套CD in Band! – trnsnt

+0

我認爲這是一種以數據庫術語來說的索引。當您使用DB索引時,相同的信息可能會存儲在不同的地方,但可以更容易地檢索它們。 –