2013-10-22 85 views
2

我使用Spring MVC和常規的JDBC。我應該在哪一層加入2個實體?

我剛纔瞭解到,我應該將業務流程分爲表示層,控制器層,服務層和存儲庫/ DAO層。現在假設我有一個實體叫Person,它可以有多個JobsJob本身是另一個具有自己屬性的實體。從我所蒐集的資料庫層只管理一個實體。現在我有一個包含另一個實體的實體。我在哪裏「加入」他們?服務層?

假設我想獲得一個person,其job尚未知(延遲加載)。但系統可能會詢問該特定person後面的job。在這種情況下,每層的作用是什麼?

請讓我知道如果我需要添加任何細節到這個問題。

+0

不要以JDBC開始,最好選擇ORM框架。 – 2013-10-22 08:31:50

+0

我有我的理由,這是否會影響我的問題的答案? – William

+0

是的,如果直接影響它。 – 2013-10-22 08:51:19

回答

0

在典型的OOP中,對象之間的關係是通過創建關聯來完成的。如果JobPerson之間的關聯是多對一的。然後您應該將Person的財產添加到Job。另一方面,PersonJob之間的關聯是一對多關係,因此您可以將一組Job添加到Person。如果您不想加載人員的所有關聯作業,則可以將此關聯映射爲延遲加載。這在ORM和JPA中默認使用。

class Person { 
Set<Job> jobs; 
} 

class Job { 
Person person; 
} 

每層用於分離和分離用於處理相同或不同對象的邏輯。

另一方面,用於映射對象模型的對象在每個圖層上可能會有所不同,並且您需要在需要更新模型時轉換數據。它取決於用於持久層的持久性框架的實現。有一個服務層可以從持久層實現中抽象出來,如果您最近更改了持久性框架,封裝在服務層中的業務邏輯將不會改變。表示層也可能包含自己的對象,這些對象被稱爲視圖對象,用於處理表示層的不同方面。創建,操作和呈現這些對象的邏輯屬於表示層,顯然是由表示框架實現的。

+0

工作不應該包含一個人的領域,其多對多的關係 –

+0

@KevinBowersox OP沒有說多個人可以做同樣的工作,所以它不能是多對多的關係,而且問題可能不是如何關聯這些對象,但不同的圖層如何協同工作。 – 2013-10-22 09:59:31

0

從我能在問題陳述收集: -

  1. 人 - 可以不工作的存在。可以有零個或多個Job(s)。
  2. 工作 - 可以獨立於執行它的人而存在。

一個清潔的方法是有一個封裝這個映射實體(因此它的表): -

class Employment{ 
    private Person person; 
    private Job job; 
} 

現在你可以從兩端查詢。如: -

  • 選擇就業WHERE PERSON.ID = XYZ

這可能會給0或多行。

每一行也會有映射作業的信息。

因此,在這種情況下,你將有你的服務/資源庫是這樣的: -

interface EmployementRepository{ 

    // CRUD methods on Employement. 
} 
+0

我有數據庫中的就業表。但假設在我的情況下,我不需要知道誰正在從事某項工作。所以,我只能通過個人實體訪問工作屬性。無論如何,這不是一個ER設計問題,我只是想知道「正確」的方式來「獲取」實體屬性的數據。我需要了解這些層次是如何工作的,就這些。 – William

0

這聽起來像有許多你處理很多關係。如果多個人可以有相同的工作,則需要創建一個聯結表。

數據模型

CREATE TABLE PERSON(PERSON_ID, OTHER_FIELDS); 
CREATE TABLE JOB(JOB_ID, OTHER_FIELDS); 
CREATE TABLE PERSON_JOB(PERSON_JOB_ID, PERSON_ID, JOB_ID, OTHER_FIELDS); 

實體

class Person{ 
    List<Job> jobs = new ArrayList<Job>(); 
} 

class Job{ 
    List<Person> workers = new ArrayList<Person>(); 
} 

在庫/ DAO層,你需要創建邏輯使用的交界處兩個實體之間,以填補這些協會表。

+0

我沒有一個實體關係設計問題,這是一個編程範例問題。你還沒有回答我的問題。我可以加入多張表格。但是我需要知道在這個特定的編程範例中正確的做法。 – William

+0

@William你問哪裏加入他們,我的答案是存儲庫/ dao層。 –

+0

對不起,我沒有意識到這是我的頭銜。無論如何,我想了解層之間的關係。這就是爲什麼我說「在這種情況下每層有什麼作用?」的問題。那麼我應該通過查詢加入他們嗎?什麼是懶加載?當我需要數據時,我應該在哪裏將代碼請求發送到數據庫? – William

相關問題