2011-03-11 328 views
1

度過了我的方式太熱門從昨天的問題:JPA映射一個地圖實體

Hibernate(JPA) mapping a HashMap

我試圖映射結構基本上是以下幾點:

Map<User, List<POJOWithComposite>> 

User是一個基本的模式,類似以下內容:

@Entity 
public class User extends Model { 
    public String username; 
    public String password; 
    ... 
} 

POJOWithComposite是另一個實體,具有某些映射實體和一些原語,類似於:

@Entity 
public class POJOWithComposite extends Model { 
    public int someIntField; 
    public OtherModel compositeEntity; 
    ... 
} 

結構可能是類似於一個購物車。因此,User包含帳戶信息,OtherModel可能是可購買的商品,POJOWithComposite是包含商品和數量的購物車。比方說,當我談到主要對象時,我的比喻會有點失敗,但是我會幽默,並且讓我們說,在每次會議中,我們都會將用戶支付的購物車添加到列表中,然後將其存檔。首先,如果列表屬於每個用戶,我可以將其添加到User模型,儘管我覺得這不是非常模塊化(即信息不是真正的用戶帳戶信息)。自動櫃員機,這張地圖坐落在一個類似公用事業的購物類中,該購物類負責將購物車與購物者相匹配,從而使我無法使User模型變得太大。 (這裏有更好的模式嗎?)

假設我繼續沿着這條路走,試試這個Map。理想情況下,我希望能夠按原樣映射它。雖然我沒有那麼幸運。

我偶然發現了一些關於映射ArrayList的討論,因爲它是Serializable,儘管在這裏沒有設法實現。

所以我做了一個包裝單位:

@Entity 
public class POJOWithCompositeList extends Model { 
    @OneToMany 
    List<POJOWithComposite> list = new ArrayList<POJOWithComposite>(); 
} 

這工作。當我使用這個實體就是這樣,我可以映射我的新:

@ManyToMany 
Map<User, POJOWithCompositeList> 

雖然我真的不喜歡這個解決辦法,因爲我再添映射的實體,即包裝企業指的是在數據庫中,這意味着另一個表另加入每個查詢等...

所以我的兩個問題是:

  1. 從設計的角度來看,是一個實用程序類堅持這個Map接受嗎?
  2. 假設我們這樣映射模型,我該如何改進映射?
+0

Map 屬於哪個實體? – 2011-03-11 19:54:25

+0

@JB Nizet,它自己的實體,它應該是一個類似單實體的實體(即只有一個實例,該實例擁有該映射)。誠然不漂亮。 – davin 2011-03-11 19:57:44

回答

1

我最終作出了新的實體@ManyToMany映射的複合材料部件,是這樣的:

@Entity 
public class POJOWithComposites extends Model { 

    @ManyToMany 
    CompositeType compositePtr; 

    @ManyToMany 
    CompositeOtherType compositeOtherPtr; 

    ... 
} 

這樣,我確實離開了複雜的這個元素了我的用戶模型,因爲它不是一部分的核心用戶實體,並允許有效的映射(外鍵)。

2

創建單例實體沒有意義。您應該簡單地映射User和POJOWithComposite之間的一對多關聯。

獲取用戶(使用session.get())並致電user.getPOJOWithComposites()獲取給定用戶的所有POJOWithComposites。如果您希望針對多個用戶使用它們,請使用HQL查找這些用戶,並遍歷找到的用戶並導航到關聯中。單例映射是休眠會話。使用它的方法來查詢數據庫。