2013-04-30 76 views
0

具有米:一些實體之間的N個真實世界的關係,例如用戶< --->組 現在我想對這種關係建模並存儲基於它的附加信息,例如,一個「質量」字段。JPA:建模M:N關係&加入表值

聽說我將不得不創建一個新的連接表USER_GROUP如下:

id | user_ref | group_ref | quality 
---------------------------------- 
1  1   1   0.5 
2  1   2   1.3 
... ...   ...  ... 

相應的實體有兩個相關的實體(private成員)的用戶和組,註釋的@ManyToOne - 註解。 在另一方面,這兩個,我的用戶和我的團隊有一組相關的USER_GROUP實體,無論是私有成員,並與@OneToMany -annotation聲明。

我有三個問題:

  1. 這是JPA 2.0模型附加字段的問題的正確方法?
  2. 我不能使用用戶和組USER_GROUP作爲主鍵 因爲它們不是有效的主鍵的類型。是否真的有必要申報一個新的小學。
  3. 這是這些連接表/實體的通用工作流程嗎?

...

EntityManager em = ... 
... 
em.getTransaction().begin(); 
User u = new User("Pete"); 
Group g = new Group("Anonymous workaholics") 
UserGroup ug = new UserGroup(); 
ug.addUser(u); 
ug.addGroup(g); 

em.persist(u); em.persist(g); em.persist(ug); 
em.getTransaction().commit(); 
em.close() 

非常感謝!

回答

1
  1. 是的,這是應該做的是很好的方式。
  2. 很可能有由兩個多對一協會組成的複合主鍵,但它的複雜得多,無論是在映射和應用程序的其餘部分,以處理這一點,這也是低效率的。你有一個實體,所以只需要像所有其他實體一樣使用自動生成的單列主鍵。這個實體曾經是多對多關聯的連接表的事實是無關緊要的。
  3. 是的,這似乎是好的,除了addUser()addGroup()方法應該被命名爲setUser()setGroup():對於給定的UserGroup只有一個用戶和一個組。我還會爲實體本身使用另一個名稱。例如,像「Membership」這樣的東西。
+0

好非常感謝您的回答cyberspeed :)讓我確認點3:應當設置,因爲它是一個簡單的setter方法。 – 2013-04-30 12:04:47

+0

是的,確切地說。 addXY通常用於將XY添加到XY集合中。這裏沒有碰撞,只有一個屬性。 – 2013-04-30 12:06:12

+0

僅供參考:http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany#Mapping_a_Join_Table_with_Additional_Columns – miguelcobain 2013-05-16 16:39:48