2012-09-17 137 views
2

我目前正在開發Spring Roo/JPA應用程序,並且最近我根據JPA繼承切換到域模型。總結我的領域模型,我有一個抽象Member實體,該實體被兩個實體分類:MaleFemale。我想避免總是注入兩個服務依賴關係(一個處理Male實體,另一個處理Female實體)。在所有我的Spring MVC控制器中,我希望避免始終注入兩個服務依賴關係(一個處理Male實體,另一個處理Female實體)。我寧願(具有相應的MemberRepository在一起)有一個MemberService服務,將返回一個Male實例或Female實例。JPA繼承,Spring Roo和Spring Data的設計問題JPA

是上述可能使用Spring Roo的註釋,比如這一個:

  • @RooService(domainTypes = { Member.class })還是那一個:
  • @RooJpaRepository(domainType = Member.class)

例如,將這個Member findByEmail(String email);返回一個對象,我可以要麼在FemaleMale類型?

更普遍,什麼是在春天的控制器和Spring服務水平,以應對實體產業的最佳實踐?

回答

0

我認爲最好的方法是使用提供了男性和女性 一個倉庫另一:

repository jpa --interface ~.repository.MaleRepository --entity ~.domain.Male 
repository jpa --interface ~.repository.FemaleRepository --entity ~.domain.Female 

你:

@RooJpaRepository(domainType = Female.class) 
public interface FemaleRepository { 
} 

@RooJpaRepository(domainType = Male.class) 
public interface MaleRepository { 
} 

,那麼你的應用程序創建的服務層對於這些型號(每種型號的服務)

service --interface ~.service.MaleService --entity ~.domain.Male 
service --interface ~.service.FamaleService --entity ~.domain.Female 

,然後你會得到:

@RooService(domainTypes = { Male.class }) 
public interface MaleService { 
} 

@RooService(domainTypes = { Female.class }) 
public interface FemaleService { 
} 

這是假設你的男性和女性對象有不同的責任,因此需要將其在不同的班級分開,在你給他們的名(男,女),我認爲他們不不過,我不知道你的商業邏輯,當然這只是一個例子(但你的真正問題有多忠實?)。

繼承的想法不僅是爲了分享「是」一個後代的共同功能,而且保留了OO邏輯的意義,當我說我的意思是,在這種情況下,例如,你可以用這個問題來解決問題如果男性和女性具有相同的屬性,則稱爲性別;如果情況並非如此,那麼爲那些專門的對象創建不同的存儲庫和服務將不痛苦。

+0

感謝卡洛斯。這個解決方案的麻煩是我需要兩個服務(男性和女性)在每個處理男性和女性實例的控制器中。此外,我的控制器代碼變得醜陋的條件邏輯,以檢查我是否需要使用一個或另一個服務... – balteo

+0

我懷疑女性和男性在你的業務中有類似的責任,因爲你想在同一個控制器中使用兩個,我認爲你的解決方案是寫一個類的性別屬性的成員... –

+0

我想過,但後來我使用繼承的功能... – balteo