2012-02-27 91 views
1

我是Spring的新手。我認爲最好用一個小例子來解釋我的問題。假設我有兩個主要類別:UserGroup。 A User可以是更多GroupGroup的一部分,顯然,可以具有更多User。所以他們之間的關係是多對多的。我想表明,是這樣的(使用JSTL):顯示@OneToMany和@ManyToOne編碼的多對多關係的屬性

<c:forEach items="${groups}" var="group"> 
    <c:out value="${group.name}"/> (<c:out value="${fn:length(group.users)}" />):<br /> 
    <c:forEach items="${groups.users}" var="user"> 
     <c:out value="${user.name}"/><br /> 
    </c:forEach><br /> 
</c:forEach> 

基本上,輸出應該是這樣的:

隨機(2):

布洛斯

星球大戰(5):
盧克
丘巴卡
達斯維達
萊婭公主
尤達

任天堂(3):
超級馬里奧
銀河戰士
塞爾達

我最初的經典@ManyToMany註釋編碼它,使用一個額外的表user_has_group (由JPA創建和管理)並且工作完美。

我需要修改結構,因爲我需要user_has_group表具有joined_date列。爲了達到這個目標,我在網上讀到,最好的解決方案是創建另一個班級(即UserHasGroup),並從Usergroup向此班級添加一對多關係。這樣做可以將其他屬性添加到UserHasGroup類中(因此可以將其他列添加到user_has_group表中)。喜歡的東西:

用戶:

@Entity 
@Table(name = "user") 
public class User 
{ 
    @Id 
    @GeneratedValue 
    @Column 
    private int id; 

    @Column 
    private String alias; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user") 
    private List<UserHasGroup> userHasGroup = new ArrayList<UserHasGroup>(); 

    // Constructors/getters/setters 
} 

組:

@Entity 
@Table(name = "`group`") 
public class Group 
{ 
    @Id 
    @GeneratedValue 
    @Column 
    private int id; 

    @Column 
    private String name; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "group") 
    private List<UserHasGroup> userHasGroup = new ArrayList<UserHasGroup>(); 

    // Constructors/getters/setters 
} 

UserHasGroup:

@Entity 
@Table(name = "user_has_group") 
public class UserHasGroup 
{ 
    @Id 
    @GeneratedValue 
    @Column 
    private int id; 

    @ManyToOne 
    @JoinColumn(name = "user_id") 
    private User user; 

    @ManyToOne 
    @JoinColumn(name = "group_id") 
    private Group group; 

    @Column 
    @Temporal(TemporalType.DATE) 
    private Date joinedDate; 

    // Constructors/getters/setters 
} 

到目前爲止,一切都很好。所有測試成功運行並且功能得以維護。

但我遇到了JSTL的問題。實際上,用這個新的結構顯然不可能做group.users遍歷用戶。

達到與之前相同的功能但使用這種新結構的最佳方式是什麼?

謝謝。

+0

是否存在與其他信息的任何問題,我已經提供? – 2012-02-29 23:05:26

回答

1

我沒有看到$ {fn:length(group.userHasGroup)}應該不起作用的原因。

您可能遇到的唯一問題是一些沒有活動會話異常。您可以通過

  • 「鑑於公開會議」攔截器使用任何解決這個問題(其中有人撥打反模式)

  • manualy在列表中的服務方法

  • 渴望迭代取得關係 - 我會非常在意,因爲這可能會導致許多查詢到數據庫

答案附加qu estion:

它應該以某種方式是這樣的:

<c:forEach items="${groups}" var="group"> 
    <c:out value="${group.name}"/> (<c:out value="${fn:length(group.userHasGroup)}" />):<br /> 
    <c:forEach items="${groups.userHasGroup}" var="userHasGroup"> 
     <c:out value="${userHasGroup.user.name}"/><br /> 
    </c:forEach><br /> 

+0

非常感謝,@ frant.hartm。你是對的,這是一個可行的解決方案。但現在讓我們說,我想顯示組中的用戶...(相應地編輯問題) – satoshi 2012-02-27 17:24:08

+0

謝謝!有時候,我覺得我很遲鈍......(我會在7個小時內獎勵賞金,現在我不能) – satoshi 2012-03-01 09:52:11