假設我有兩個類:一個用於Band,一個用於CD。我希望能夠輕鬆訪問一個樂隊的所有CD並找到CD的樂隊。如何在Java中表示1..n關係
我的解決方法是在CD場Band
,並帶一個ArrayList<CD>
。
但我不覺得這是一個很好的解決方案。有沒有人知道這種情況下更好的設計?
假設我有兩個類:一個用於Band,一個用於CD。我希望能夠輕鬆訪問一個樂隊的所有CD並找到CD的樂隊。如何在Java中表示1..n關係
我的解決方法是在CD場Band
,並帶一個ArrayList<CD>
。
但我不覺得這是一個很好的解決方案。有沒有人知道這種情況下更好的設計?
我明白爲什麼你不喜歡這個解決方案。
您只是儲存信息一次,但您必須更新兩個類別的變化。
如果更改的Band
一個CD
,你必須從舊Band
刪除CD
,設置Band
在CD
,然後將其添加到新的Band
。
這當然很複雜並且容易出錯。
你的類沒有簡單的getter/setter方法。相反,您必須在您的域類中實現大量邏輯才能保持一致性。
當然,優點是您總是可以訪問CD
的Band
,反之亦然。它是一個權衡。例如,你應該使用CD
的Band
作爲其equals
實現的一部分。
這裏有一個有趣替代,這可能是advantegous在某些情況下:
使用你的類Band
和CD
只作爲簡單的POJO,並使用另一個類(即MusicService
),以解決關係:
class MusicService {
Band getBand(CD cd);
List<CD> getCDs(Band band);
addCD(Band band, CD cd);
}
感謝您的回答,您完全理解我的觀點!我想我會使用一個服務類,聽起來更安全的想法! – trnsnt
你可以有光盤的Set
在帶班。
可替代地,保持一個唯一的ID在頻帶類別,將每個唯一的帶映射與多個CD。
有沒有需要有一個樂隊在現場CD,按我的理解。
是否有(功能上)每張CD都有一個樂隊ID和每張CD上的樂隊的參考有什麼區別? –
如果您的CD僅保留對ID的引用,則Band可能會收到垃圾回收,如果沒有其他引用。 – Holger
您的解決方案完全合理。其實這就是JPA
的原理。 見Java Persistence/OneToMany。 JPA是如何實現自己的ORM的很好的參考。
你是不是存儲信息的兩倍: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;
}
}
感謝您的回答。 我知道我沒有在內存中存儲兩次這樣的信息,但是就像功能信息的重複一樣。如果我在CD中存儲對樂隊的引用,它在功能上等同於擁有一套CD in Band! – trnsnt
我認爲這是一種以數據庫術語來說的索引。當您使用DB索引時,相同的信息可能會存儲在不同的地方,但可以更容易地檢索它們。 –
爲什麼你找不到好的解決辦法? – Joni
java和外鍵之間的關係是什麼。據我所知,外鍵和主鍵都在sql中。爲什麼你的標籤是java和外鍵? – SpringLearner
我把外鍵,因爲如果我把它映射到數據庫我會用外鍵鏈接CD和樂隊。 我不覺得這是一個很好的解決方案,因爲我存儲了兩次相同的信息,而我只是問我是否有更好的解決方案:) – trnsnt