2012-02-23 177 views
0

我會嘗試清楚地解釋我的問題: 我有兩個表格:文檔和類別,它們有多對多的關係。我正在學習如何用Java編寫優雅的程序,請原諒我的無知。如何在Java中創建兩個元素之間的關係?

我正在做我的數據庫搜索,我想說明當我從resultSet創建對象時,檢索到的元素(文檔)及其類別之間的相同關係。

我創建了一個類文檔和一個類的類別;我是否需要添加類別的ArrayList作爲類文檔的屬性?和一個文檔ArrayList的屬性在類別?

我還需要對某些文檔進行修改,是否需要在類文檔中創建屬性標識,以便將表中的標識存儲在數據庫中,以便更新更容易?

我的class文件看起來像:

public class Document { 
    private Integer id; // Id from DB, 0 if new object 
    private String name; 
    private String url; 
    private Date dateCreated; 
    private ArrayList<String> category; 

    // getters & setters... 
} 

這可能是混亂的,但我只是想事情「標準」的方式!我知道如何通過使用多個查詢等以「骯髒」的方式完成所有這些......但是我需要再次從經驗豐富的OO開發人員那裏獲得想法!

編輯: 我刪除了MVC; 我是新的在Java中,所以我只是使用基本的Java (沒有ORM,沒有框架)。我不知道Hibernate是什麼,我正在調查。

回答

3

我需要添加 類別的ArrayList作爲類文檔的屬性嗎?和一個 文檔的ArrayList作爲屬性的類別?

這取決於你想訪問你的對象的方式。如果它足夠滿足您的使用情況通過文件

document1.getCategories().get(0)... 

接入類,你不需要通過類別來訪問文件這樣

category1.getDocuments().get(0)... 

,那麼這將是足夠了一個名單。在這種情況下,你會調用這些類之間的關係單向。如果兩種方法都需要,你需要兩個列表。在這種情況下,你的關係是雙向的。無論如何,如果單向關係是足夠的,你應該更喜歡那個,因爲在這種情況下你不必保持兩個列表同步。


我也需要做一些文件的修改,我需要創建class文件的屬性ID使ID從表存儲在數據庫,以便更新是更容易?

這是某種設計問題。在大多數情況下,包含代理數據庫密鑰是有意義的,因爲它可以更容易地執行更新。無論如何,如果您的對象可以通過其他屬性(例如名稱)或這些屬性的組合來識別,那麼當然不需要包含代理鍵。


正如你說,你是學習Java的我想補充一些一般性意見:

你宣佈這樣的例子名單:

private ArrayList<String> category; 

您應該更喜歡接口List,而不是具體的實現類ArrayList。

private List<String> category = new ArrayList<String>(); 

這將允許您使用任何類型的實現(例如ArrayList或LinkedList),因爲您的代碼不再依賴於具體的實現類。

另外我想提一下,有很多支持將數據庫內容映射到Java對象的框架。所以如果你必須做很多映射,你應該考慮使用其中的一種(例如休眠)。

+0

非常感謝!所以我會滿足於這個「手動」(?)映射。我會在晚些時候看看Hibernate! – zwan 2012-02-23 20:33:49

0

如果您使用的是像Hibernate這樣的ORM,您可以使用ArrayList<Category>而不是一個字符串。這將是更純粹的面向對象方法。不知道爲什麼你將其標記爲MVC。

0

托馬斯的回答非常好。我只想補充一點,如果您想要雙向關係,您需要小心確保雙方合作伙伴的名單保持一致。

有一個good article about this by Vincent Partington。他從撰寫JPA對象的角度寫作,但他描述的模式(使用internal*方法)完全適用於普通對象。

相關問題